Linq中的SelectMany和维数组?

Roy*_*mir 3 .net c# linq arrays .net-4.0

为什么这段代码编译:

byte[][] my2DArray =new  byte  [][]{  
                        new byte[] {1, 2},
                        new byte[] {3, 4},
                       };

  var r = my2DArray.SelectMany(f=> f);
Run Code Online (Sandbox Code Playgroud)

而这一个不是:

byte[,] my2DArray =new byte [2,2]{  
                                   {1, 2},
                                   {3, 4},
                                 };

   var r = my2DArray.SelectMany(f=> f);
Run Code Online (Sandbox Code Playgroud)

[][]作为[,]

编辑

为什么我需要那个?

我需要创建一个单维数组,以便将其发送到 GetArraySum

当然我可以创建重载,但我想将mutli dim转换成一个暗淡的.(GetArraySum也用于纯维数组).

void Main()
{
    byte[][] my2DArray =new  byte  [][]{  
                                         new byte[] {1, 2},
                                         new byte[] {3, 4},
                                      };

      var sum = GetArraySum(my2DArray.SelectMany(f=> f).ToArray());

}



 int GetArraySum(byte [] ar)
 {
 return ar.Select(r=>(int)r).Sum();
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

不是[] []是[,]

不是.A byte[][]是一个锯齿状数组 - 一个数组数组."外部"数组的每个元素都是对法线的byte[]引用(当然是空引用).

A byte[,]矩形数组 - 单个对象.

矩形数组不实现IEnumerable<T>,只有非泛型IEnumerable,但您可以使用Cast将每个项目转换为byte:

byte[,] rectangular = ...;
var doubled = rectangular.Cast<byte>().Select(x => (byte) x * 2);
Run Code Online (Sandbox Code Playgroud)

这只会将矩形数组视为单个字节序列 - 它不是一个"子数组"序列,就像你使用锯齿状数组一样......你不能使用它Cast<byte[]>.

就个人而言,我很少使用任何一种多维数组 - 你想在这里实现什么?可能有更好的方法.

编辑:如果您只想尝试将矩形数组中的所有内容相加,那很简单:

int sum = array.Cast<byte>().Sum(x => (int) x);
Run Code Online (Sandbox Code Playgroud)

毕竟,你并不关心事情是如何布局的 - 你只需要所有值的总和(假设我已经正确地解释了你的问题).