使用linq查找数组中的连续元素

本文关键字:连续 元素 数组 linq 查找 使用 | 更新日期: 2023-09-27 18:27:52

我正在读取一些数据。

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

我希望能够找到gzip(0x1f8b)的幻数开始的索引。有没有办法通过linq做到这一点?

使用linq查找数组中的连续元素

我不确定这是否非常有效,但

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

有点作弊,但如果你可以使用索引:

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

不过,我支持这个评论——在这种情况下,一个简单的循环更清晰、可读、更高效。