2011-03-15 10 views

Respuesta

67

como esto:

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

O

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

(que es probablemente más rápido)

+12

Potencialmente más fácil de leer con "Todos" en lugar de "Cualquiera". También es posible que desee utilizar First() en lugar de [0] en caso de que no se pueda realizar el acceso a la lista (IEnumerable). if (list.All (o => o == list.First())) {...} –

+0

'list.Distinct(). Skip (1) .Any()' no es diferente de 'list.Distinct () .Count! = 1' ¿verdad? –

+0

@GraemeWicksted el objetivo de Any() es ser más rápido si se encuentra un elemento que NO coincide. Entonces dejas de evaluar la lista. Lo que sí es un poco más claro es '! (List.Any (o => o! = List [0]))' que es verdadero si no hay elementos que sean diferentes de la primera, es decir, si son todos iguales –

1

VB.NET Versión:

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

O

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

creé método simple extensión principalmente para facilitar la lectura 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; 
    } 
0

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 lleva a cabo de manera similar como if (list.Any(o => o != list[0])), sin embargo, la diferencia no es significativo, entonces sugiero usar el más legible.

Cuestiones relacionadas