使用c#LINQ将字节数组与子数组拆分
我遇到了更严重的问题: 我有一个类似{0xNN,0xNN,0xNN,0xNN,0xFF,0xNN,0xNN,0xFF,0xFF}的数组,其中{0xFF,0xFF}是一个delimeter使用c#LINQ将字节数组与子数组拆分,c#,arrays,linq,indexing,split,C#,Arrays,Linq,Indexing,Split,我遇到了更严重的问题: 我有一个类似{0xNN,0xNN,0xNN,0xNN,0xFF,0xNN,0xNN,0xFF,0xFF}的数组,其中{0xFF,0xFF}是一个delimeter 通过使用LINQ是否可以获得像{0xNN,0xNN,0xNN,0xNN},{0xNN,0xNN}}这样的枚举?我认为您不能在LINQ中完成它,因为您的分隔符是由集合的两个元素定义的。您可以编写这样的扩展,用任意长度的分隔符一次性完成任务 public static class Extensions {
通过使用LINQ是否可以获得像{0xNN,0xNN,0xNN,0xNN},{0xNN,0xNN}}这样的枚举?我认为您不能在LINQ中完成它,因为您的分隔符是由集合的两个元素定义的。您可以编写这样的扩展,用任意长度的分隔符一次性完成任务
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;
}
}
}
可能是@Mike That q所说的子串类型的重复,而不是拆分。@Mike在那里看不到LINQ或任何其他类型的lambdas。@IceCroft:如果你的问题只是“可能吗”,那么答案是肯定的。也许你应该展示一些代码或上下文,以便我们理解为什么这被限制为“LINQ”(或者请描述你认为LINQ是什么,因为LINQ与lambda方法无关)。@SixlettVariables同意,ofc仅使用LINQ是可能的,但很难避免大量无意义的重复。@Akli,另一个被拒绝的好办法。我已把你的建议稍加修改。
var joinedBytes = new byte[] { ... }
var delimiter = new byte[] { 0xFF, 0xFF }
var splitBytes = joinedBytes.Split(delimiter);