Estoy teniendo un momento difícil con un problema aparentemente fácil y embarazoso. Todo lo que quiero es el siguiente elemento en un IEnumberable sin usar Skip (1) .Take (1) .Single(). Este ejemplo ilustra el problema básico.Alternativa a 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;
}
}
}
Aparte de ser feo, este ejemplo funciona. Pero digamos que IEnumerable contiene 2 millones de elementos, entonces la declaración LINQ hace que el programa se ejecute insoportablemente lento. Lo que quiero es simple. Solo quiero el siguiente elemento en un IEnumberable <>. Todos mis problemas se resolverían si había una función como:
_nextChar = getAlphabet().moveNext() //or getNext()
es mucho más preferible que la solución mantiene la misma estructura/diseño/funcionalidad del ejemplo sin embargo, yo soy flexible. Mi programa es un analizador de archivos, y entre los 2 millones de líneas de texto hay algunas claves como "dinero = 324" donde "dinero" y "324" son elementos vecinos en el IEnumberable y cuando el analizador encuentra "dinero" quiero " 324 ". (Que no lo hace:?. D Lo siento por el mal juego de palabras)
Esto suena como una caja de FSM. – Necros
Este código siempre recuperará el segundo elemento de la secuencia, es decir, 'B', no creo que sea eso lo que quiere ... –
La respuesta de la respuesta ya ha respondido a su pregunta. Sin embargo, para referencia futura, en lugar de '.Take (1) .Single()' puede usar '.First()' que hace lo mismo. – Timwi