Linq中的SelectMany和维数组?
为什么这段代码编译:
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(); }
不是[] []是[,]
不。 byte[][]
是一个锯齿状数组 – 一个数组数组。 “外部”数组的每个元素都是对普通byte[]
引用(当然是空引用)。
byte[,]
是一个矩形数组 – 一个对象。
矩形数组不实现IEnumerable
,只实现非通用IEnumerable
,但您可以使用Cast
将每个项目转换为一个byte
:
byte[,] rectangular = ...; var doubled = rectangular.Cast().Select(x => (byte) x * 2);
这只会将矩形数组视为单个字节序列 – 它不是一个“子数组”序列,就像你使用锯齿状数组一样……你不能使用Cast
例如。
就个人而言,我很少使用任何一种多维数组 – 你想在这里实现什么? 可能有更好的方法。
编辑:如果您只想尝试将矩形数组中的所有内容相加,那么很容易:
int sum = array.Cast().Sum(x => (int) x);
毕竟,你并不关心事情是如何布局的 – 你只需要所有值的总和(假设我已经正确地解释了你的问题)。
这不会编译,因为[,]
是多维数组而[][]
是数组数组( msdn )
所以,你的第一个例子将返回数组,其中第二个 – 它很复杂
- 如何订阅更改DependencyProperty?
- C#中的某些内容可以在运行时更改浮点比较行为吗?
- 刮刮Facebook应用程序获取数据
- 使用LINQ查询获取索引值的集合
- System.Threading.Timer的可伸缩性如何?
- Scaffolding EntityFramework 6无法将’System.Data.Entity.Core.Objects.ObjectContext’类型的对象强制转换为’System.Data.Objects.ObjectContext’
- 使用.NET框架监视目录中文件更改的可靠方法
- 如何在HttpClient response.ReasonPhrase中获取真正的错误消息?
- 将CSV文件上传到SQL Server