为什么这段代码会编译:
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变成一个昏暗的。 (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();
}
答案 0 :(得分:8)
不是[] []是[,]
没有。 byte[][]
是jagged array - 数组数组。 “外部”数组的每个元素都是对普通byte[]
的引用(当然是空引用)。
byte[,]
是rectangular array - 单个对象。
矩形数组不实现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);
毕竟,你并不关心事情是如何布局的 - 你只需要所有值的总和(假设我已经正确地解释了你的问题)。
答案 1 :(得分:1)
这不会编译,因为[,]
是多维数组而[][]
是数组数组(msdn)
所以,你的第一个例子将返回数组,其中第二个是复杂的