がbyte[]
あり、配列の一部を抽出して文字列に変換したいと考えています。LINQ を使用して 1 行で実行したい。これは私が見つけることができる最高のものでしたが、失敗しました。
String id = new String(payload.Skip(60).Take(92-60+1).ToString());
ペイロード[60]からペイロード[92]を抽出し、文字列に変換します。より良い方法はありますか?そして、私はまだこの構文でいくつかのエラーが発生しています..
linq は必要ありません。ASCIIEncoding.GetString
var str = Encoding.ASCII.GetString(payload, 60, 92-60+1);
次のようなことを試すことができます:
string.Concat((object[])payload.Skip(60).Take(92-60+1).Cast<object>().ToArray())
これを試して。
String id =Encoding.ASCII.GetString(payload.ToArray().Skip(60).Take(92-60+1).ToArray())
UTF8でエンコードされた文字列を想定すると、次のようにlinqを使用できます。
Encoding.UTF8.GetString(bytes.Skip(60).Take(32).ToArray());
より簡単で効率的な解決策は次のとおりです。
Encoding.UTF8.GetString(bytes, 60, 32);
これにより、アレイのセクションのコピーが回避され、ストップウォッチで簡単にチェックすると、20倍高速であることがわかります。
最初に、バイト配列を文字列に変換するために何らかのエンコーディングを使用する必要があります (私の意見では、これは、バイト配列から文字列への他のアプローチと比較して安全な方法です)。このエンコーディングは、バイト配列形式に依存しており、よく知っています。
第二に、配列があるため、 のような組み込みの配列関数を使用することArray.Copy
をお勧めします。これは linq よりも高速であり、配列の 92 要素をトラバースする必要がなく、33 要素をトラバースするだけで済みます。
var secondArray = new byte[92-60+1];
Array.Copy(payLoad, 60, secondArray, 0, 92-60+1);
UTF8Encoding encoding = new UTF8Encoding();
string result = encodin.GetString(secondArray);