是否有一种简单的方法可以获取相同大小的少数列表,并使用linq在每个索引中创建一个新的最小值/最大值?我的意思是如何比较相同索引的项目,并选择哪一个是Max或Min,如下所示:
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}
我简化了那些循环,看起来更清晰。我知道我可以使用Concat和GroupBy,然后选择Max out of each,但对于没有键值的简单类型和类,我无法理解。
编辑:我应该更精确。示例中的列表是手动分配的,但我问的是解决方案,这对于任何数量的列表都是灵活的。此外,列表总是大小相同。答案 0 :(得分:6)
列表列表的大小没有限制,列表可以是任意长度。
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();
答案 1 :(得分:4)
这应该可以满足您的需求:
List<int> newList = Some2dList[0].Select((x, column) => Math.Max(x, Some2dList[1][column])).ToList();
诀窍是使用Select的重载,允许您在lambra表达式中获得正在使用的项目的索引:这使得可以比较放置在同一索引中的两个不同列表中的两个项目。显然,如果它是您正在寻找的最小值,请使用Math.Min而不是Math.Max。
只有一件事,我理所当然地认为两个子列表具有相同数量的元素。
答案 2 :(得分:3)
有点异常,但似乎有效。它假设有一个列表
Enumerable.Range(0, Some2dList.FirstOrDefault().Count)
.Select(columnIndex =>
Some2dList.Max(row => row[columnIndex]))
.ToList();