remarks cref c# vb.net list linq-to-objects

cref - remarks c#



Verificar si todos los artículos son iguales en una lista (4)

Creé un método de extensión simple principalmente para la legibilidad que funciona en cualquier IEnumerable.

if (items.AreAllSame()) ...

Y la implementación del método:

/// <summary> /// Checks whether all items in the enumerable are same (Uses <see cref="object.Equals(object)" /> to check for equality) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="enumerable">The enumerable.</param> /// <returns> /// Returns true if there is 0 or 1 item in the enumerable or if all items in the enumerable are same (equal to /// each other) otherwise false. /// </returns> public static bool AreAllSame<T>(this IEnumerable<T> enumerable) { if (enumerable == null) throw new ArgumentNullException(nameof(enumerable)); using (var enumerator = enumerable.GetEnumerator()) { var toCompare = default(T); if (enumerator.MoveNext()) { toCompare = enumerator.Current; } while (enumerator.MoveNext()) { if (toCompare != null && !toCompare.Equals(enumerator.Current)) { return false; } } } return true; }

Tengo elementos List (Of DateTime). ¿Cómo puedo verificar si todos los elementos son iguales con una consulta LINQ? En cualquier momento dado, podría haber 1, 2, 20, 50 o 100 elementos en la lista.

Gracias


Esta es una opción, también:

if (list.TrueForAll(i => i.Equals(list.FirstOrDefault())))

Es más rápido que if (list.Distinct().Skip(1).Any()) , y funciona de forma similar como if (list.Any(o => o != list[0])) , sin embargo, la diferencia es no significativo, entonces sugiero usar el más legible.


Me gusta esto:

if (list.Distinct().Skip(1).Any())

O

if (list.Any(o => o != list[0]))

(que es probablemente más rápido)


Versión VB.NET:

If list.Distinct().Skip(1).Any() Then

O

If list.Any(Function(d) d <> list(0)) Then