【问题标题】:SelectMany in Linq and dimensional array?Linq和维度数组中的SelectMany?
【发布时间】:2012-12-25 11:18:03
【问题描述】:

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

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 转换为 one 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();
 }

【问题讨论】:

    标签: c# .net arrays linq .net-4.0


    【解决方案1】:

    isn't [][] is as [,]

    没有。 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&lt;byte[]&gt;

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

    编辑:如果您只是想在一个矩形数组中求和,这很简单:

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

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

    【讨论】:

    • 因为它是一个单一的对象,他在 Ienumerables 中找不到另一个...对吗?
    • @RoyiNamir:不完全——问题是它只实现了IEnumerable,而不是IEnumerable&lt;T&gt;,绝对不是IEnumerable&lt;byte[]&gt;
    • 谢谢。我不知道 [,] 是一个 single 对象,这是我的问题....再次感谢您。
    • @RoyiNamir:因为Sum只对IEnumerable&lt;T&gt;起作用,而矩形数组只实现了非泛型IEnumerable接口。
    • @Sipo:可能是矩形的,但无论如何它都会被封装在Board 类中,所以我可以给它任何我想要的功能。
    【解决方案2】:

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

    所以,您的第一个示例将返回数组,而第二个 - 它很复杂

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多