2

有没有一种简单的方法来获取几个相同大小的列表并使用 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,但是对于没有键值的简单类型和类,我无法弄清楚。

编辑:我应该更精确。示例中的列表是手动分配的,但我在询问解决方案,这对于任何数量的列表比较都是灵活的。此外,列表的大小始终相同。

4

3 回答 3

6

List Of Lists的大小没有限制,并且列表可以是任意长度。

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();
于 2013-08-20T18:20:08.757 回答
4

这应该做你正在寻找的:

List<int> newList = Some2dList[0].Select((x, column) => Math.Max(x, Some2dList[1][column])).ToList();

诀窍是采用 Select 的重载,它允许您在lambra 表达式中使用您正在使用的项目的索引:这使得比较两个不同列表中放置在同一索引处的两个项目成为可能。显然,如果它是您要查找的最小值,请使用 Math.Min 而不是 Math.Max。

只有一件事,我认为这两个子列表具有相同数量的元素是理所当然的。

于 2013-08-20T18:06:22.630 回答
3

有点不正常,但似乎有效。它假设有一个列表

Enumerable.Range(0, Some2dList.FirstOrDefault().Count)
   .Select(columnIndex => 
       Some2dList.Max(row => row[columnIndex]))
   .ToList();
于 2013-08-20T18:20:04.167 回答