Tôi không biết bất kỳ cách tích hợp nào; như thường lệ, bạn luôn có thể viết phương thức mở rộng của riêng mình. Đây là một trong những đỉnh đầu của tôi (có thể có những cách hiệu quả hơn để thực hiện nó):
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;
}
}
}
Tôi sẽ kiểm tra để đảm bảo rằng điều này là đúng, nhưng nó sẽ cung cấp cho bạn ý tưởng cơ bản; lặp qua các phần tử, theo dõi chuỗi giá trị cuối cùng được truy xuất, đặt cờ khi chuỗi được tìm thấy và khi cờ được đặt, hãy bắt đầu trả về từng phần tử tiếp theo.
Chỉnh sửa - Tôi đã chạy thử nghiệm và hoạt động chính xác. Dưới đây là một số mã thử nghiệm:
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();
}
bạn sẽ không phải lo lắng về những gì NET có thể giả định về mã hóa và như vậy mà sẽ cho kết quả sai? – thelsdj
Tôi tin rằng nếu bạn đang tìm kiếm một chuỗi byte chính xác, mã hóa sẽ không thực sự quan trọng (miễn là cả nguồn và chuỗi tìm kiếm đều nằm trong cùng một mã hóa). Bạn có thể sử dụng lớp ASCIIEncoding để giúp chuyển đổi qua lại. – MikeP