3

このコードがコンパイルされる理由:

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);

[][]ではありません[,]か?

編集

なぜそれが必要なのですか?

に送信されるように、1 次元配列を作成する必要があります。 GetArraySum

もちろん、オーバーロードを作成できますが、マルチ ディムを 1 ディムに変換したかったのです。(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();
 }
4

2 に答える 2

8

[][] ではありません [,] と同じです

いいえ、Abyte[][]ギザギザの配列、つまり配列の配列です。「外側の」配列の各要素は、通常の参照byte[](またはもちろん null 参照) です。

Abyte[,]矩形配列- 単一のオブジェクトです。

長方形配列は を実装せずIEnumerable<T>、非ジェネリックのみを実装しますが、各アイテムを にキャストするためにIEnumerable使用できます。Castbyte

byte[,] rectangular = ...;
var doubled = rectangular.Cast<byte>().Select(x => (byte) x * 2);

ただし、長方形配列を単一のバイトシーケンスとして扱います-ただし、ギザギザ配列の場合と同じように「サブ配列」のシーケンスではありませんCast<byte[]>...たとえば、使用できません。

個人的には、どちらの種類の多次元配列もめったに使用しません。ここで何を達成しようとしていますか? より良いアプローチがあるかもしれません。

編集:長方形の配列ですべてを合計しようとしているだけなら、簡単です:

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

結局のところ、物事がどのように配置されているかはあまり気にしません - すべての値の合計が必要なだけです (私があなたの質問を正しく解釈したと仮定して)。

于 2012-12-25T11:19:42.423 に答える
1

[,]は多次元配列であり、[][]配列の配列 ( msdn )であるため、これはコンパイルされません。

したがって、最初の例は配列を返しますが、2番目の例は複雑です

于 2012-12-25T11:21:58.413 に答える