如何在多维数组上使用LINQ“展开”数组?

12
考虑以下数组: int[,] numbers = new int[3, 2] { { 2, 1 }, { 3, 4 }, { 6, 5 } }; 我希望使用LINQ构建一个IEnumerable,包含2、1、3、4、6、5这些数字。请问最好的方法是什么?

2
这是一个二维数组,而不是一个数组的数组(锯齿形数组)。 - Tim Schmelter
1
你说得对...这是一个多维数组。 - Kees C. Bakker
@BenRobinson,我需要使用LINQ,另一个问题不使用LINQ。 - Kees C. Bakker
1
var flatNumbers = numbers.Cast<int>(); (该代码段被复制并修改自链接文章。使用了LINQ) - Ben Robinson
@KeesC.Bakker 我撤销了你最后的编辑,因为那是对你最初问题的根本性更改。 - Sergey Berezovskiy
显示剩余3条评论
3个回答

28
也许只是简单的:
var all = numbers.Cast<int>();

演示


1
我给你点赞!在这种情况下,“Cast”比“OfType”开销小一些。 - Sergey Berezovskiy
2
点赞。但无论如何,我们都会得到装箱和拆箱,因为这通过非泛型的IEnumerable接口进行,该接口产生对象框,然后由Cast进行拆箱。 - Jeppe Stig Nielsen

7
怎么样:
Enumerable
    .Range(0,numbers.GetUpperBound(0)+1)
    .SelectMany(x => Enumerable.Range(0,numbers.GetUpperBound(1)+1)
    .Select (y =>numbers[x,y] ));

或者整理一下。
var xLimit=Enumerable.Range(0,numbers.GetUpperBound(0)+1);
var yLimit=Enumerable.Range(0,numbers.GetUpperBound(1)+1);
var result = xLimit.SelectMany(x=> yLimit.Select(y => numbers[x,y]));

EDIT Revised Question....

var result = array.SelectMany(x => x.C);

6

使用简单的foreach从2D数组中获取数字:

int[,] numbers = new int[3, 2] { { 2, 1 }, { 3, 4 }, { 6, 5 } };
foreach(int x in numbers)
{
   // 2, 1, 3, 4, 6, 5.
}

LINQ(使用LINQ来完成您的初始任务是一个很大的开销,因为除了简单迭代数组外,还将创建CastIterator(Tim答案中提到)或OfTypeIterator)
IEnumerable<int> query = numbers.OfType<int>();

我需要使用LINQ。我的问题有点复杂...但我需要使用LINQ。数组中的每个对象都有一个属性,其中包含一个数组,我需要将其压缩成一个单一的列表。 - Kees C. Bakker
1
请发布您的整个问题,因为您将获得不同的答案。 - Ben Robinson
2
这可能是一份作业,但也可能是一个极其复杂的系统中最小的可工作示例,而提问者不想打扰我们处理。;-) - Tempestas Ludi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接