2011-03-13 123 views
0

可能重复:
How to split an array into a group of n elements each?分裂排序列表到多个列表或数组

我相信我过于简化了这个问题,所以我编辑了一点。在.NET 3.5控制台应用程序中,我有一个SortedList字符串,它将包含未知数量的键/值对。我将通过读取Microsoft Word文档中的表中的行来获取此集合。用户将能够添加额外的项目到这个集合中。一旦用户完成添加到集合中,我需要将集合写回新的Microsoft Word文档。难点在于必须按照字母顺序将这些项目回写到多列表中,首先在表格的左侧,然后在表格的右侧向下,并且由于输出可能会跨越多页I还需要在多个页面上保持订单。因此,第一页上的第一个表格可能包含表格左侧的A到C和表格右侧的C到F,然后如果表格超过了页面,则需要新的表格。新表可能包含F到I和右侧L到O.Since表可能会跨越多个页面,并且我知道每个表每页的最大行数我可以通过计算来确定总共需要多少个表。此图像是输出的代表: table output
为了简明起见,如果输出表最多可以包含每行7行和每行2个项目,并且我有28个项目,则需要将输出写入2表,但当然我不会知道有多少表需要读取数据,所以我不能简单地硬编码输出表的数量。

为了创建所描述的表结构,将SortedList分成n个集合的最好方法是什么?

+0

您指出的帖子完全符合我的需求。谢谢 – JDM 2011-03-14 20:32:00

回答

0

不需要拆分列表(如果唯一的目的是在表中写入项目)。

您可以遍历列表并在合适的位置写入行分隔符。

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 

您应该通过指定脚本的输出是什么来扩展您的问题。如果你想写一个表到控制台,上面的解决方案可能是最好的。但是,如果您使用的是丰富的用户界面(如WinForms或ASP.NET),则应使用内置工具和控件在表格中显示数据。

0

我用LINQ玩了一下,想出了这个解决方案。它根据“输入参数”(rowsPerPagecolumnsPerPage)创建某种树结构。最后一页上的列不能有相同的大小(如果问题存在,代码可以很容易地修复)。

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); 
     } 
    } 
}