可能重复:
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个集合以创建所描述的表结构的最佳方法是什么?
答案 0 :(得分: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),则应使用内置工具和控件在表中显示数据。
答案 1 :(得分:0)
我和LINQ玩了一下,然后提出了这个解决方案。它根据“输入参数”(rowsPerPage
和columnsPerPage
)创建某种树结构。最后一页上的列不能具有相同的大小(如果有问题,代码可以轻松修复)。
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);
}
}
}