我正在读取一些数据。使用linq查找数组中的连续元素
byte[] data = inHandle.ReadBytes(int.MaxValue);
我希望能够找到gzip(0x1f8b)的幻数开始处的索引。有没有办法通过linq做到这一点?
我正在读取一些数据。使用linq查找数组中的连续元素
byte[] data = inHandle.ReadBytes(int.MaxValue);
我希望能够找到gzip(0x1f8b)的幻数开始处的索引。有没有办法通过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的索引或空。
或者
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);
}
+1为第二个解决方案:) – 2012-03-15 22:03:08
还挺作弊,但如果你可以使用索引:
var idx = data.Select((b,index)=> new
{
IsGzipStart = b == 0x1f && data[index+1] == 0x8b,
Index = index
}).FirstOrDefault(x => x.IsGzipStart);
Console.WriteLine(idx.Index);
我第二次评论,但 - 一个简单的循环更清晰,可读性和更有效的在这种情况下。
不意味着居高临下,但为什么使用LINQ而不是标准的数组方法..'Array.IndexOf'? – 2012-03-15 21:18:52
只是想知道它是否可以完成。我也可以使用for循环。 – SamFisher83 2012-03-15 21:22:10