从 IEnumerable 中删除子 IEnumerable
Remove sub IEnumerable from IEnumerable
我有一个 IEnumerable<Byte>
,我想从中删除只能出现一次的字节序列。第一个数组可以很大,但第二个数组不能超过 50 字节
最好(也是最快)的方法是什么?
感谢您的帮助!
IEnumerable 是只读的,如果你想删除它的一些居民,你应该把它称为列表而不是 "select ... bla.ToList()"
您可以为此创建静态方法,如下所示:
public static class Helper
{
public static IEnumerable<byte> RemoveSubSequence(this IEnumerable<Byte> sequence, IEnumerable<Byte> subSequence)
{
List<byte> list = sequence.ToList();
byte[] subSequenceList = subSequence.ToArray();
int i = 0;
int count = 0;
for (; i < list.Count && count != subSequenceList.Length; i++)
for (int i2 = 0; i2 < subSequenceList.Length && count != subSequenceList.Length; i2++)
if (list[i + i2] == subSequenceList[i2]) count++; else count = 0;
list.RemoveRange(i - 1, count);
return list;
}
}
然后你可以像这样使用它:
IEnumerable<byte> bytes = new byte[] { 5, 7, 6, 9, 1, 5, 7, 6, 7, 0, 6, 4, 0, 6, 4, 8 };
IEnumerable<byte> subSequence = new byte[] { 6, 7, 0, 6, 4, 0, 6, 4, 8 };
bytes = bytes.RemoveSubSequence(subSequence);
foreach (var item in bytes) Console.Write(item + " ");
Console.WriteLine("\n\n");
输出:5, 7, 6, 9, 1, 5, 7,
我有一个 IEnumerable<Byte>
,我想从中删除只能出现一次的字节序列。第一个数组可以很大,但第二个数组不能超过 50 字节
最好(也是最快)的方法是什么?
感谢您的帮助!
IEnumerable 是只读的,如果你想删除它的一些居民,你应该把它称为列表而不是 "select ... bla.ToList()"
您可以为此创建静态方法,如下所示:
public static class Helper
{
public static IEnumerable<byte> RemoveSubSequence(this IEnumerable<Byte> sequence, IEnumerable<Byte> subSequence)
{
List<byte> list = sequence.ToList();
byte[] subSequenceList = subSequence.ToArray();
int i = 0;
int count = 0;
for (; i < list.Count && count != subSequenceList.Length; i++)
for (int i2 = 0; i2 < subSequenceList.Length && count != subSequenceList.Length; i2++)
if (list[i + i2] == subSequenceList[i2]) count++; else count = 0;
list.RemoveRange(i - 1, count);
return list;
}
}
然后你可以像这样使用它:
IEnumerable<byte> bytes = new byte[] { 5, 7, 6, 9, 1, 5, 7, 6, 7, 0, 6, 4, 0, 6, 4, 8 };
IEnumerable<byte> subSequence = new byte[] { 6, 7, 0, 6, 4, 0, 6, 4, 8 };
bytes = bytes.RemoveSubSequence(subSequence);
foreach (var item in bytes) Console.Write(item + " ");
Console.WriteLine("\n\n");
输出:5, 7, 6, 9, 1, 5, 7,