【问题标题】:split SortedList to multiple lists or arrays [duplicate]将 SortedList 拆分为多个列表或数组
【发布时间】:2011-03-13 04:26:24
【问题描述】:

可能重复:
How to split an array into a group of n elements each?

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

获取我的 SortedList 并将其拆分为 n 个集合以创建所描述的表结构的最佳方法是什么?

【问题讨论】:

  • 您指出的帖子正是我所需要的。谢谢

标签: c# .net sortedlist


【解决方案1】:

没有必要拆分列表(如果唯一的目的是在表格中写入项目)。

您可以遍历列表并在适当的位置写入换行符。

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),则应使用内置工具和控件在表格中显示数据。

【讨论】:

    【解决方案2】:

    我玩了一点 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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 2013-02-06
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多