在Linq和维度数组中选择many

本文关键字:选择 many 数组 Linq | 更新日期: 2023-09-27 17:49:33

为什么这段代码可以编译:

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

当然我可以创建重载,但是我想把多个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();
 }

在Linq和维度数组中选择many

不是[][]是[,]

byte[][]是一个锯齿数组——数组的数组。"外部"数组的每个元素都是对普通byte[]的引用(当然,也可能是空引用)。

byte[,]是一个矩形数组 -一个单一的对象。

矩形数组不实现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);

毕竟,您并不真正关心事物是如何布局的-您只想要所有值的总和(假设我正确理解了您的问题)。

无法编译,因为[,]是多维数组,而[][]是数组的数组(msdn)

那么,您的第一个示例将返回数组,而第二个-它是复杂的