3

为什么此代码编译:

byte[][] my2DArray =new  byte  [][]{  
                        new byte[] {1, 2},
                        new byte[] {3, 4},
                       };
 
  var r = my2DArray.SelectMany(f=> f);

而这个不是:

byte[,] my2DArray =new byte [2,2]{  
                                   {1, 2},
                                   {3, 4},
                                 };
 
   var r = my2DArray.SelectMany(f=> f);

不是[][][,]

编辑

为什么我需要那个?

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

当然我可以创建超载,但我想将 mutli dim 转换为一个 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();
 }
4

2 回答 2

8

不是 [][] 是 [,]

不,Abyte[][]是一个锯齿状数组- 一个数组数组。“外部”数组的每个元素都是对法线byte[]的引用(当然也可以是空引用)。

Abyte[,]是一个矩形阵列- 单个对象。

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

byte[,] rectangular = ...;
var doubled = rectangular.Cast<byte>().Select(x => (byte) x * 2);

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

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

编辑:如果您只是想对矩形数组中的所有内容求和,这很容易:

int sum = array.Cast<byte>().Sum(x => (int) x);

毕竟,您并不真正关心事物的布局 - 您只需要所有值的总和(假设我已经正确解释了您的问题)。

于 2012-12-25T11:19:42.423 回答
1

这不会编译,因为[,]它是多维数组并且[][]是数组数组(msdn

因此,您的第一个示例将返回数组,而第二个示例则很复杂

于 2012-12-25T11:21:58.413 回答