2016-08-10 5 views
1

ToArray()を使用せずに新しいをMemoryStream()に保存するか、新しい配列を作成することはできますか?ToArray()を使用せずにメモリリストへのバイトリストを変換

これは私の現在の方法であって、リストの上に

public Packet(List<byte> data) 
{ 
    // Create new stream from data buffer 
    using (Stream stream = new MemoryStream(data.ToArray())) 
    { 
     using (BinaryReader reader = new BinaryReader(stream)) 
     { 
      Length = reader.ReadInt16(); 
      pID = reader.ReadByte(); 
      Result = reader.ReadByte(); 
      Message = reader.ReadString(); 
      ID = reader.ReadInt32(); 
     } 
    } 
} 
+2

なぜこのように悪いですか?投稿された回答はあなたに代わるものを与えますが、私はそれらがもっと効率的であるとは思っていません。 –

答えて

0

なぜだけではなく、ループ

... 
    using (MemoryStream stream = new MemoryStream(data.Count)) { 
    foreach (var b in data) 
     stream.WriteByte(b); 

    // You may want to return to stream's origin 
    stream.Position = 0; 
    ... 
0

どうのようなものについて:

public Packet(List<byte> data) 
{ 
    using (Stream stream = new MemoryStream()) 
    { 
     // Loop list and write out bytes 
     foreach(byte b in data) 
      stream.WriteByte(b); 

     // Reset stream position ready for read 
     stream.Seek(0, SeekOrigin.Begin); 

     using (BinaryReader reader = new BinaryReader(stream)) 
     { 
      Length = reader.ReadInt16(); 
      pID = reader.ReadByte(); 
      Result = reader.ReadByte(); 
      Message = reader.ReadString(); 
      ID = reader.ReadInt32(); 
     } 
    } 
} 

しかし、なぜあなたが最初の場所でリストを持っていますか?最初にbyte[]としてメソッドに渡すことはできませんか?そのリストをどのように埋め込むのか興味深いでしょう。

+0

私は、TCPパケットストリームを扱うのにbyte []を使用するとArray.resizeを使用しました。そのため、私のプログラムは以前の配列データで新しい配列を上書きしてしまいました。配列作成の直後にスレッドスリープを追加すると修正される可能性があります。 インターネットで読んだことは、リストは動的配列を持つ最も効率的な方法だと言います。それが私の必要なものです。 –

1

ToArrayソリューションは、文書化されたAPIを使用して可能な最も効率的なソリューションです。 MemoryStreamは配列をコピーしません。それはちょうどそれを格納します。したがって、唯一のコピーはList<T>.ToArray()です。

コピーを避けたい場合は、List<T>をリフレクションで開き、バッキングアレイにアクセスする必要があります。それに対して私は助言する。

代わりに、法的手段を使用してバッキングアレイを取得できるコレクションを使用してください。あなた自身で作成するか、最初にMemoryStreamを使用してください。

List<T>は、とにかくバイトを移動する最も効率的な方法ではありません。それらを格納するのは大丈夫ですが、移動するには通常オーバーヘッドがあります。たとえば、項目をバイトで追加すると、memcpyよりはるかに遅くなります。

+1

可能であれば、 'List 'ではなく、最初から 'byte []'を使用してください。 –

+0

私はbyte []を使用していましたが、リストはarray.resizeを複数回使用するよりも効率的です。 –

+0

@usr、ありがとうございます - この** MemoryStreamは配列をコピーしません。それはちょうどそれを保存します。**私の質問に完璧な答え。 –

関連する問題