开发者

split SortedList to multiple lists or arrays [duplicate]

This question already has answers here: Closed 11 years ago.

Possible Duplicate:

How to split an array into a group of n elements each?

I believe I oversimplified this question so I am editing it a bit. From within a .NET 3.5 console application I have a SortedList string,string that will contain an unknown number of key/value pairs. I will get this collection by reading in rows from a table within a Microsoft Word document. The user will then be able to add additional items into this collection. Once the user has finished adding to the collection I then need to write the collection back to a new Microsoft Word document. The difficulty is that the items must be written back to the document in alphabetical order to a multicolumn table, first down the left side of the table and then down the right side of the table and since the output will likely be spread across multiple pages I need to also keep the order across multiple pages. So the first table on the first page may contain A through C on the left side of the table and C through F on the right side of the table then if the table exceeds the page a new table is needed. The new table may contain F through I and the right side L through O.Since the table will likely span multiple pages and I know the maximum number of rows per table per page I can do the math to determine how many tables I will need overall. This image is representative of the output:

split SortedList to multiple lists or arrays [duplicate]

For the sake of brevity if a output table can contain a maximum of 7 rows per 开发者_运维问答page and 2 items per row and I have 28 items then I will need to write the output to 2 tables but of course I won't really know how many tables I will need until I read in the data so I can't simply hardcode the number of output tables.

What is the best way to take my SortedList and split it out into n collections in order to create the table structure described?


It is not necessary to split the list (if the only purpose is to write items in a table).

You can just iterate through the list and write row breaks in appropriate places.

for (int i = 0; i < sortedList.Count; i++)
{
   if (i % 3 == 0)
   {
       Console.Write("|"); // write beginning of the row
   }
   Console.Write(sortedList[i].ToString().PadRight(10)); // write cell
   Console.Write("|"); // write cell divider
   if (i % 3 == 2)
   {
      Console.WriteLine() // write end of the row       
   }
}
// optional: write empty cells if sortedList.Count % 3 != 0
// optional: write end of the row if sortedList.Count % 3 != 2

You should extend your question by specifying what is the output of your script. If you want to write a table to the console, the above solution is probably the best. However, if you are using rich user interface (such as WinForms or ASP.NET), you should use built-in tools and controls to display data in table.


I played with LINQ a little bit and came up with this solution. It creates some kind of tree structure based on the "input parameters" (rowsPerPage and columnsPerPage). The columns on the last page could not have the same size (the code can be easily fixed if it is a problem).

SortedList<string, string> sortedList ... // input sortedList

int rowsPerPage = 7;
int columnsPerPage = 2;

var result = from col in
                 (from i in sortedList.Select((item, index) => new { Item = item, Index = index })
                 group i by (i.Index / rowsPerPage) into g
                 select new { ColumnNumber = g.Key, Items = g })
             group col by (col.ColumnNumber / columnsPerPage) into page
             select new { PageNumber = page.Key, Columns = page };

foreach (var page in result)
{
    Console.WriteLine("Page no. {0}", page.PageNumber);
    foreach (var col in page.Columns)
    {
        Console.WriteLine("\tColumn no. {0}", col.ColumnNumber);
        foreach (var item in col.Items)
        {
            Console.WriteLine("\t\tItem key: {0}, value: {1}", item.Item.Key, item.Item.Value);
        }
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜