2012-03-15 10 views
1

私はいくつかのデータを読んでいます。linqを使って配列内の連続する要素を見つける

byte[] data = inHandle.ReadBytes(int.MaxValue); 

gzip(0x1f8b)のマジックナンバーが始まるインデックスを見つけることができます。 linq経由でそれを行う方法はありますか?

+4

標準的な配列方法の代わりにLINQを使用する理由はありません。「Array.IndexOf'? –

+0

それができるかどうかだけ知りたい。私はforループも使うことができます。 – SamFisher83

答えて

2

私は、これは非常に効率的であるかどうかわからないんだけど、それが見つからない場合は

byte[] data = new byte[]{ 1, 2, 3, 4, 0x1f, 0x8b, 5, 6 }; 

var indexedData = data.Select ((element,index) => new {element, index}); 

int? magicIndex = 
    (from d1 in indexedData 
    from d2 in indexedData 
    where d1.index == d2.index-1 && d1.element == 0x1f && d2.element == 0x8b 
    select (int?)d1.index).SingleOrDefault(); 

Console.WriteLine(magicIndex); 

から0x1fまたはnullのインデックスにその結果を。

それとも

var magicNo = data.Zip(data.Skip(1), 
    (first, second) => first*256 + second).Select ((d,i) => new {d, i}).FirstOrDefault (d => d.d==0x1f8b); 

if(magicNo != null) 
{ 
    Console.WriteLine(magicNo.i); 
} 
+0

+1の2番目の解決策:) –

0

インデックスを使用できるかどうかちょっと浮気しかし:

var idx = data.Select((b,index)=> new 
       { 
        IsGzipStart = b == 0x1f && data[index+1] == 0x8b, 
        Index = index 
       }).FirstOrDefault(x => x.IsGzipStart); 
Console.WriteLine(idx.Index); 

私は2番目かのコメント - シンプルなループが、この場合には多くの、より明確な読みやすく、より効率的です。

関連する問題