gpt4 book ai didi

c# - 合并多个列表

转载 作者:太空狗 更新时间:2023-10-30 00:19:37 24 4
gpt4 key购买 nike

鉴于我有一个列表列表,List<code><List<T>></code> ,其中所有列表包含 0 个或多个项目,可能但不一定全部相同。我希望有一个包含列表中所有项目的列表......但我希望顺序如下:首先是所有列表中的第一个项目,以便它们出现在“ super 列表”中。

例如

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' }

(请注意,这不是按字母顺序排列的,Blueberry 在 Baboon 之前)

当然,我可以用一个计数器遍历“ super 列表”,将项目一个一个地添加到结果列表中,只要有一个不为空的列表即可:

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 , GroupByAggregate ,但无法让它们工作。

那么:是否有一个漂亮的 LINQ 函数或多个函数的组合,可以将其变成漂亮的代码,或者我应该坚持(并可能优化)我当前的函数?

编辑:一个简单的 SelectMany(x => x) 也不能解决问题,因为它保留了列表的顺序,而不是像我的算法那样折叠它们。有关详细信息,请参阅我最初的问题。

最佳答案

你需要SelectMany

var result = lists.SelectMany(x => x.Select((s, inx) => new { s, inx }))
.GroupBy(x => x.inx)
.SelectMany(x => x.Select(y => y.s))
.ToList();

编辑

对于那些想尝试的人,初始化代码。

List<List<string>> lists = new List<List<string>>()
{
new List<string>(){ "Apple", "Blueberry", "Cranberry" },
new List<string>(){ "Anteater", "Baboon", "Camel", "Dodo"},
new List<string>(){ "Albatross", "Blackbird", "Chicken"},
};

编辑 2

输出: 苹果、食蚁兽、信天翁、蓝莓、狒狒、黑鸟、蔓越莓、 Camel 、鸡、渡渡鸟

关于c# - 合并多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com