3
byte[] result = memStream.ToArray();                              
memStream.Close();
byte[] temp = result.Take(255);
var str = System.Text.Encoding.Default.GetString(temp);

上記はresult.Take(255);行で失敗します。に変換できないと表示IEnumerableされbyte[]、キャストが不足しているかどうかを尋ねられます。

私はC#が初めてで、何をすべきか正確にはわかりません。

4

2 に答える 2

7

Take()列挙時に実行される列挙子オブジェクトを返します。

ここに画像の説明を入力

これは配列ではないため、バイト配列への参照に割り当てることはできません。ただし、LINQ では、任意のシーケンスを取り、そのメソッドを呼び出すことで適切な型の配列に変換できます。ToArray()

byte[] temp = result.Take(255).ToArray();

ToArray()からの結果を列挙し、結果をTake(255)新しい配列に入れ、その配列を返します。

取得したものを列挙できるのと同じように配列を列挙できるため、少し混乱しますがTake(255)、多くのものを列挙できます。これは共通の動作の 1 つにすぎませんが、実際には非常に異なるオブジェクトです。

どちらかを次のように割り当てることができますIEnumerable<byte>:

IEnumerable<byte> a = result.Take(255);
IEnumerable<byte> b = result.Take(255).ToArray();

...それは彼らが本当に共通していることの 1 つだからです。

于 2016-08-05T15:40:46.760 に答える
1

コードでエラーが発生する理由は、型を.Take(result)返し、それを配列IEnumerable<byte>に割り当てようとしているためです。はLINQメソッドであり、これは通常、チェーンを目的としてすべての LINQ メソッドが機能する方法です (たとえば、result.Skip(5).Take(10))。byte[].Take()

この.ToArray()メソッドはIEnumerable<T>結果を受け取り、それを に変換しT[]ます。したがって.ToArray()、行に追加すると問題が解決します。

byte[] temp = result.Take(255).ToArray();

別の配列を使用してから作成する代わりに、.Take()おそらくこれがよりパフォーマンスが高いことがわかります。

byte[] temp = new byte[255]
Array.Copy(result, temp, 255);

その理由は.ToArray()、結果の配列がどのくらいの大きさになる必要があるのか​​ わからないため、比較的小さなサイズを選択する必要があり、より多くの項目が読み込まれると、サイズを変更して容量を拡張する必要があるためです。これは、配列がすべてのアイテムを格納するのに十分な大きさになる前に、アイテムの数に応じて何十回も発生する可能性があります。

于 2016-08-05T15:46:26.687 に答える