aquí es un enfoque que es relativamente simple, sólo repite una vez más de la secuencia, y funciona con cualquier secuencia (no sólo las listas):
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;
}
}
}
Aquí hay otro que es aún más simple, ya que sólo una consulta LINQ, pero utiliza los efectos secundarios en la cláusula WHERE, que es desagradable:
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;
});
Una tercera alternativa, que es un poco más limpia, pero utiliza un método SelectConsecutive
que es básicamente SelectPairs
de this answer, pero cambió el nombre a ser un poco más claro :)
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
.Where(z => z.x == z.y);
¿Puede proporcionar un poco más de información sobre por qué/cómo? Se siente como una pregunta de tarea/entrevista. Sería muy simple de resolver simplemente usando un bucle y comparar previo al actual y almacenar/restablecer si se encuentra la coincidencia - solo un poco de lógica extra para detener el conteo de 7 veces. Si quisieras que se resolviera en linq o algo así, eso es más interesante. –