在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();
}
标题>
不是[][]是[,]
。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)
那么,您的第一个示例将返回数组,而第二个-它是复杂的