Tôi đang gặp khó khăn với một vấn đề dường như dễ dàng và đáng xấu hổ. Tất cả những gì tôi muốn là phần tử tiếp theo trong IEnumberable mà không cần sử dụng Skip (1) .Take (1) .Single(). Ví dụ này minh họa vấn đề cơ bản.Thay thế cho IEnumerable <T> .Skip (1) .Take (1) .Single()
private char _nextChar;
private IEnumerable<char> getAlphabet()
{
yield return 'A';
yield return 'B';
yield return 'C';
}
public void sortAlphabet()
{
foreach (char alpha in getAlphabet())
{
switch (alpha)
{
case 'A': //When A pops up, I want to get the next element, ie 'B'
_nextChar = getAlphabet().Skip(1).Take(1).Single();
break;
case 'B': //When B pops up, I want 'C' etc
_nextChar = getAlphabet().Skip(1).Take(1).Single();
break;
}
}
}
Khác hơn là xấu xí, ví dụ này hoạt động. Nhưng chúng ta hãy nói rằng IEnumerable chứa 2 triệu phần tử, sau đó câu lệnh LINQ làm cho chương trình thực thi không chậm chạp. Những gì tôi muốn là đơn giản. Tôi chỉ muốn phần tử tiếp theo trong một IEnumberable <>. Tất cả các vấn đề của tôi sẽ được giải quyết nếu có một chức năng như:
_nextChar = getAlphabet().moveNext() //or getNext()
Nó được nhiều ưu đãi nếu các giải pháp giữ cùng cấu trúc/layout/chức năng của ví dụ tuy nhiên, tôi linh hoạt. Chương trình của tôi là trình phân tích cú pháp tệp và trong số 2 triệu dòng văn bản là một số khóa như "tiền = 324" trong đó "tiền" và "324" là các yếu tố hàng xóm trong IEnumberable và khi trình phân tích cú pháp xuất hiện "tiền" tôi muốn " 324 ". (Ai không:?. D Xin lỗi vì chơi chữ xấu)
Điều này nghe giống như trường hợp FSM. – Necros
Mã này sẽ luôn truy lục phần tử thứ hai của chuỗi, tức là 'B', tôi không nghĩ đó là những gì bạn muốn ... –
Câu trả lời được bình chọn hàng đầu đã trả lời câu hỏi của bạn. Tuy nhiên, để tham khảo trong tương lai, thay vì '.Take (1) .Single()' bạn có thể sử dụng '.irst()' làm điều tương tự. – Timwi