Oto podejście, które jest stosunkowo prosta, tylko iteracje raz na sekwencji i współpracuje z dowolnej kolejności (nie tylko wymienia):
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;
}
}
}
Oto jeszcze jeden, który jest jeszcze prostsza, że to tylko zapytań LINQ, ale korzysta z efektów ubocznych w klauzuli WHERE, która jest brzydki:
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;
});
Trzecia alternatywa, która jest nieco czystsze, ale używa SelectConsecutive
metodę, która jest w zasadzie SelectPairs
z this answer, ale przemianowany być nieco jaśniejsze :)
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
.Where(z => z.x == z.y);
Czy możesz podać trochę więcej informacji, dlaczego? Czujesz się jak zadanie domowe/wywiad. Byłoby bardzo łatwo rozwiązać tylko za pomocą pętli i porównać poprzedni do bieżącego i zapisać/zresetować, jeśli zostanie znaleziony mecz - tylko trochę dodatkowej logiki, aby zatrzymać 7 liczone 3 razy. Jeśli chcesz go rozwiązać w Linq lub coś w tym stylu, to jest to bardziej interesujące. –