Voilà une approche qui est relativement simple, seulement itère une fois sur la séquence, et travaille avec une séquence (pas de listes seulement):
public IEnumerable<T> FindConsecutiveDuplicates<T>(this IEnumerable<T> source)
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
T current = iterator.Current;
while (iterator.MoveNext())
{
if (EqualityComparer<T>.Default.Equals(current, iterator.Current))
{
yield return current;
}
current = iterator.Current;
}
}
}
est ici un autre qui est encore plus simple en ce qu'elle est seulement une requête LINQ, mais il utilise des effets secondaires dans la clause Where, qui est méchant:
IEnumerable<int> sequence = ...;
bool first = true;
int current = 0;
var result = sequence.Where(x => {
bool result = !first && x == current;
current = x;
first = false;
return result;
});
Une troisième alternative, qui est un peu plus propre mais utilise une méthode SelectConsecutive
qui est essentiellement SelectPairs
de this answer, mais renommé être un peu plus clair :)
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
.Where(z => z.x == z.y);
Pouvez-vous fournir un peu plus d'informations sur pourquoi et comment? Se sent comme une question de devoir/entrevue. Il serait très simple de résoudre juste en utilisant une boucle et de comparer précédent à courant et stocker/réinitialiser si la correspondance est trouvée - juste un peu de logique supplémentaire pour arrêter 7 étant compté 3 fois. Si vous voulez qu'il soit résolu en linq ou quelque chose, c'est plus intéressant. –