Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq将几个列表合并为一个_C#_Linq_List_Merge - Fatal编程技术网

C# 使用linq将几个列表合并为一个

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<

是否有一种简单的方法可以获取几个相同大小的列表,并使用linq在每个索引中创建一个新的最小/最大值ouf?我的意思是如何比较同一索引中的项目,并选择最大值或最小值,如下所示:

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
看起来更华丽:)(谢谢编辑)