鉴于我有一个列表列表,List<List<T>>
,其中所有列表可能包含 0 个或多个项目,但不一定全部相同。我希望有一个包含列表中所有项目的列表...但我希望顺序如下:首先是所有列表中的第一个项目,以便它们出现在“超级列表”中。
Ex.
List[0] = { 'Apple', 'Blueberry', 'Cranberry' }
List[1] = { 'Anteater', 'Baboon', 'Camel', 'Dodo'}
List[2] = { 'Albatross', 'Blackbird', 'Chicken'}
result = { 'Apple', 'Anteater', 'Albatross', 'Blueberry', 'Baboon',
'Blackbird', 'Cranberry', 'Camel', 'Chicken', 'Dodo' }
(请注意,这不是按字母顺序排列,蓝莓位于狒狒之前)
当然,我可以用计数器循环遍历“超级列表”,将项目逐一添加到结果列表中,只要有一个不为空的列表即可:
int i = 0;
bool done = false;
while (!done)
{
bool found = false;
foreach (list l in superlist)
{
if (l.Count() > i)
{
found = true;
result.Add(l[i]);
}
}
i++;
if (!found)
done = true;
}
但使用一些优化的 LINQ 函数来执行此操作会更好。我一直在调查Zip http://msdn.microsoft.com/en-us/library/dd267698.aspx, GroupBy http://msdn.microsoft.com/en-us/library/system.linq.enumerable.groupby.aspx and 总计的 http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aggregate.aspx,但无法让他们工作。
那么:是否有一个漂亮的 LINQ 函数或多个函数的组合,可以将其变成漂亮的代码,或者我应该坚持(也许优化)我当前的函数?
编辑:简单的 SelectMany(x => x) 也不起作用,因为它保留列表的顺序,而不是像我的算法那样折叠它们。有关更多详细信息,请参阅我最初的问题。