Linq sans bibliothèques supplémentaires, mais avec les effets secondaires est un rapide et sale ( prior
L'effet secondaire est laid) solution :
List<string> foo = new List<string> { "12", "14", "14", "12", "12", "14" };
string prior = null;
List<string> result = foo
.Where((v, i) => i == 0 || v != prior)
.Select(v => prior = v)
.ToList();
En cas général il est possible que vous souhaitiez mettre en œuvre un méthode d'extension :
public static partial class EnumerableExtensions {
public static IEnumerable<T> DistinctSuccessive<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null) {
// public method arguments validation
if (null == source)
throw new ArgumentNullException(nameof(source));
// equals: either default or custom one
Func<T, T, bool> equals = (left, right) => null == comparer
? object.Equals(left, right)
: comparer.Equals(left, right);
bool first = true;
T prior = default(T);
foreach (var item in source) {
if (first || !equals(item, prior))
yield return item;
first = false;
prior = item;
}
}
}
Dans ce cas
List<string> result = foo
.DistinctSuccessive()
.ToList();