Hier ist ein Ansatz, der relativ einfach ist, nur eine Iteration einmal über die Reihenfolge, und arbeitet mit jeder Sequenz (nicht nur aufgelistet):
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;
}
}
}
Hier ist eine andere, die in noch einfacher ist, dass es nur eine LINQ-Abfrage, aber es nutzt Nebenwirkungen in der Where-Klausel, die böse ist:
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;
});
Eine dritte Alternative, die etwas sauberer ist, verwendet aber eine SelectConsecutive
Methode, die im Grunde SelectPairs
von this answer, aber umbenannt wird etwas klarer :)
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
.Where(z => z.x == z.y);
Können Sie ein wenig mehr Informationen darüber, warum/wie? Fühlt sich an wie eine Hausaufgabe/Interviewfrage. Es wäre sehr einfach zu lösen, nur mit einer Schleife und vergleichen Sie vorher mit aktuellen und speichern/reset, wenn Übereinstimmung gefunden wird - nur ein bisschen zusätzliche Logik zu stoppen 7 gezählt 3 mal. Wenn Sie wollten, dass es in linq oder etwas gelöst wird, dann ist das interessanter. –