組み込みの方法は知りません。いつものように、いつでも独自の拡張メソッドを作成できます。これが私の頭の上にあるものです(それを実装するためのより効率的な方法があるかもしれません):
public static IEnumerable<T> AfterSequence<T>(this IEnumerable<T> source,
T[] sequence)
{
bool sequenceFound = false;
Queue<T> currentSequence = new Queue<T>(sequence.Length);
foreach (T item in source)
{
if (sequenceFound)
{
yield return item;
}
else
{
currentSequence.Enqueue(item);
if (currentSequence.Count < sequence.Length)
continue;
if (currentSequence.Count > sequence.Length)
currentSequence.Dequeue();
if (currentSequence.SequenceEqual(sequence))
sequenceFound = true;
}
}
}
これが正しいことを確認する必要がありますが、基本的な考え方は理解できるはずです。要素を反復処理し、取得した値の最後のシーケンスを追跡し、シーケンスが見つかったときにフラグを設定し、フラグが設定されると、後続の各要素を返し始めます。
編集 - テストを実行しましたが、正しく動作します。ここにいくつかのテストコードがあります:
static void Main(string[] args)
{
byte[] data = new byte[]
{
0x01, 0x02, 0x03, 0x04, 0x05,
0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA
};
byte[] sequence = new byte[] { 0x02, 0x03, 0x04, 0x05 };
foreach (byte b in data.AfterSequence(sequence))
{
Console.WriteLine(b);
}
Console.ReadLine();
}