C# 如何在多维数组上使用LINQ来';放松';阵列?

C# 如何在多维数组上使用LINQ来';放松';阵列?,c#,.net,linq,multidimensional-array,jagged-arrays,C#,.net,Linq,Multidimensional Array,Jagged Arrays,考虑以下数组: int[,]number=新的int[3,2]{{2,1},{3,4},{6,5} 我想用LINQ构造一个数字为2,1,3,4,6,5的IEnumerable 最好的方法是什么?使用simple 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(

考虑以下数组:

int[,]number=新的int[3,2]{{2,1},{3,4},{6,5}

我想用LINQ构造一个数字为2,1,3,4,6,5的IEnumerable


最好的方法是什么?

使用simple 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的开销很大,因为将创建OfTypeIterator的CastIterator(Tim的答案),而不是简单的迭代数组)

IEnumerable query=numbers.OfType();
也许只是:

var all = numbers.Cast<int>();
var all=numbers.Cast();

那么:

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]));
编辑修改后的问题

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

这是一个二维数组而不是数组数组(锯齿数组)。你说得对。。。这是一个多维数组。副本中可能有一个linq查询,但我会选择foreach,因为linq查询非常不透明,foreach清楚您在做什么。'var flatNumbers=numbers.Cast();'从链接文章中复制和修改。所有LINQI都需要使用LINQ。我的问题更复杂。。。但我需要使用LINQ。数组中的每个对象都有一个属性,该属性包含一个数组,我需要将其合并到一个列表中。请发布您的整个问题,因为您将得到不同的答案。这可能是家庭作业,但也可能是令人难以置信的复杂系统的最小工作示例,询问者不想打扰我们;-)+1从我这里-
Cast
是一个比类型
的开销稍小的类型,在这种情况下是UPPOUTED。但无论哪种方式,我们都会得到装箱和拆箱,因为这通过非泛型的
IEnumerable
接口,该接口生成
object
框,这些框由
Cast
拆箱。
var result = array.SelectMany(x => x.C);