, "LINQ-like" . , . , , . , .
static class Extensions {
public static IEnumerable<Tuple<T, Int32>> ToRunLengths<T>(this IEnumerable<T> source) {
using (var enumerator = source.GetEnumerator()) {
if (!enumerator.MoveNext())
yield break;
var currentValue = enumerator.Current;
var runLength = 1;
while (enumerator.MoveNext()) {
var value = enumerator.Current;
if (!Equals(value, currentValue)) {
yield return Tuple.Create(currentValue, runLength);
currentValue = value;
runLength = 0;
}
runLength += 1;
}
yield return Tuple.Create(currentValue, runLength);
}
}
}
, , . Object.Equals. , , IEqualityComparer<T>, , .
:
var numbers = new[] { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
var runLengths = numbers.ToRunLengths();
:
4 1
1 2
3 2
2 1
5 1
3 1
2 2