C# 使用linq将几个列表合并为一个
是否有一种简单的方法可以获取几个相同大小的列表,并使用linq在每个索引中创建一个新的最小/最大值ouf?我的意思是如何比较同一索引中的项目,并选择最大值或最小值,如下所示:C# 使用linq将几个列表合并为一个,c#,linq,list,merge,C#,Linq,List,Merge,是否有一种简单的方法可以获取几个相同大小的列表,并使用linq在每个索引中创建一个新的最小/最大值ouf?我的意思是如何比较同一索引中的项目,并选择最大值或最小值,如下所示: List<List<int>> Some2dList = new List<List<int>> { new List<int> { 1, 2, 3, 4, 5 }, new List<
List<List<int>> Some2dList = new List<List<int>>
{ new List<int> { 1, 2, 3, 4, 5 },
new List<int> { 5, 4, 3, 2, 1 } } ;
List<int> NewList = new List<int>(5);
for(int i=0; i< 5; i++)
{
int CurrentHighest=0;
for(int j=0; j<2; j++)
{
if (Some2dList[j][i] > CurrentHighest)
CurrentHighest = Some2dList[j][i];
}
NewList.Add(CurrentHighest);
}
//Which gives me {5,4,3,4,5}
List Some2dList=新列表
{新名单{1,2,3,4,5},
新名单{5,4,3,2,1};
List NewList=新列表(5);
对于(int i=0;i<5;i++)
{
int CurrentHighest=0;
对于(int j=0;j电流最高)
CurrentHighest=Some2dList[j][i];
}
NewList.Add(当前最高);
}
//这给了我{5,4,3,4,5}
我简化了这些循环,使其看起来更清晰。我知道我可以使用Concat和GroupBy,然后从中选择Max,但是对于没有键值的简单类型和类,我无法理解它
编辑:我应该更精确些。示例中的列表是手动分配的,但我想问的是解决方案,这对于比较的任何数量的列表都是灵活的。此外,列表的大小始终相同。这应该满足您的需求:
List<int> newList = Some2dList[0].Select((x, column) => Math.Max(x, Some2dList[1][column])).ToList();
List newList=Some2dList[0]。选择((x,column)=>Math.Max(x,Some2dList[1][column])).ToList();
诀窍是使用Select重载,它允许您在lambra表达式中使用项目的索引:这使您可以比较两个不同列表中的两个项目,并将它们放置在同一索引中。显然,如果它是您要查找的最小值,请使用Math.min而不是Math.Max
只有一件事,我想当然地认为这两个子列表具有相同数量的元素 有点不正常,但似乎有效。但它假定有一个列表
Enumerable.Range(0, Some2dList.FirstOrDefault().Count)
.Select(columnIndex =>
Some2dList.Max(row => row[columnIndex]))
.ToList();
列表的大小没有限制,列表可以是任意长度
List<List<int>> Some2dList = new List<List<int>>{
new List<int> { 1, 2, 3, 4, 5 },
new List<int> { 5, 4, 3, 2, 1 },
new List<int> { 8, 9 }
};
var res = Some2dList.Select(list => list.Select((i, inx) => new { i, inx }))
.SelectMany(x => x)
.GroupBy(x => x.inx)
.Select(g => g.Max(y=>y.i))
.ToList();
List Some2dList=新列表{
新名单{1,2,3,4,5},
新名单{5,4,3,2,1},
新名单{8,9}
};
var res=Some2dList.Select(list=>list.Select((i,inx)=>new{i,inx}))
.SelectMany(x=>x)
.GroupBy(x=>x.inx)
.选择(g=>g.Max(y=>y.i))
.ToList();
谢谢。它对2个列表当然很有效,但是如果我有更多的列表呢?+1我认为这是2元素数组的答案。请注意,显示默认的单字母命名有时很难用变量名的“x,y”来读取-类似“index”或“column”而不是“y”会更好。它们在每个变量中的条目数量是否总是相同的?(即,e新双精度[x,5]
)是,无需检查值是否存在。所有列表的大小都相同。+1。非矩形选项的花式LINQ。请注意,如果性能很重要,由于创建了许多中间集合,这可能不是正确的方法。@AlexeiLevenkov当然。如果性能很重要,那么最好编写一个非Linq版本。效果很好,+1,但我认为Sayse的答案是正确的,因为它更简单。你们两个在同一时刻回答了。谢谢。不用担心,就像我说的,它假设至少有1个列表,否则你会得到FirstOrDefault+1的NRE。这可能是矩形情况下的最佳解决方案。请注意,在这段代码中,FirstOrDefault()
并不比First
好多少,因为它在任何情况下都会抛出空引用。@AlexeiLevenkov-我甚至会说使用[0]
,但FirstOrDefault
看起来更华丽:)(谢谢编辑)