我遇到了更进一步的问题:
我有一个像 {0xNN, 0xNN, 0xNN, 0xNN, 0xFF, 0xFF, 0xNN, 0xNN, 0xFF, 0xFF} 这样的数组,其中 {0xFF, 0xFF} 是一个分隔符。
是否可以使用 LINQ 获得像 {{0xNN, 0xNN, 0xNN, 0xNN} , {0xNN, 0xNN}} 这样的枚举?
你可以写一个这样的扩展,用任何长度的分隔符一次性完成这项工作。
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> Split<T>(
this IEnumerable<T> source,
IEnumerable<T> delimiter)
{
var delimiterList = delimiter.ToList();
var outputBuffer = new List<T>();
var m = 0;
foreach(var item in source)
{
if item.Equals(delimiterList[m])
{
m++;
if(m == delimiterList.Count)
{
m = 0;
if (outputBuffer.Count > 0)
{
yield return outputBuffer;
outputBuffer = new List<T>();
}
}
}
else
{
outputBuffer.AddRange(delimiterList.Take(m));
if (item.Equals(delimiterList[0]))
{
m = 1;
}
else
{
m = 0;
outputBuffer.Add(item);
}
}
}
outputBuffer.AddRange(delimiterList.Take(m));
if (outputBuffer.Count > 0)
{
yield return outputBuffer;
}
}
}
你可以像这样使用它。
var joinedBytes = new byte[] { ... }
var delimiter = new byte[] { 0xFF, 0xFF }
var splitBytes = joinedBytes.Split(delimiter);
我认为你不能在 LINQ 中做到这一点,因为你的分隔符是由集合的两个元素定义的。