Je rencontre des difficultés avec un problème apparemment facile et embarrassant. Tout ce que je veux, c'est l'élément suivant dans un IEnumberable sans utiliser Skip (1) .Take (1) .Single(). Cet exemple illustre le problème de base.Alternative à 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;
}
}
}
plus d'être laid, cet exemple fonctionne. Mais disons que l'IEnumerable contient 2 millions d'éléments, alors l'instruction LINQ rend le programme incroyablement lent. Ce que je veux est simple. Je veux juste l'élément suivant dans un IEnumberable <>. Tous mes problèmes seraient résolus s'il y avait une fonction comme:
_nextChar = getAlphabet().moveNext() //or getNext()
Il est bien préférable que la solution conserve la même structure/layout/fonctionnalité de l'exemple cependant, je suis flexible. Mon programme est un analyseur de fichiers, et parmi les 2 millions de lignes de texte sont des clés comme "money = 324" où "money" et "324" sont des éléments voisins dans IEnumberable et quand l'analyseur rencontre "money" je veux " 324 ". (Qui n'a pas:. D Désolé pour le mauvais jeu de mots)
Cela ressemble à un cas de FSM. – Necros
Ce code récupérera toujours le deuxième élément de la séquence, c'est-à-dire 'B', je ne pense pas que ce soit ce que vous voulez ... –
La réponse la plus demandée a déjà répondu à votre question. Cependant, pour référence future, au lieu de '.Take (1) .Single()' vous pouvez utiliser '.First()' qui fait la même chose. – Timwi