Si todos los elementos de una lista tienen el mismo valor, entonces necesito usar ese valor; de lo contrario, necesito usar un "otherValue". No puedo pensar en una forma simple y clara de hacer esto.
Consulte también Forma ordenada de escribir un bucle que tiene una lógica especial para el primer elemento de una colección.

Respuestas:
La forma más limpia que se me ocurre. Puede convertirlo en una línea introduciendo val, pero First () se evaluaría n veces, duplicando el tiempo de ejecución.
Para incorporar el comportamiento de "conjunto vacío" especificado en los comentarios, simplemente agregue una línea más antes de las dos anteriores:
fuente
.Anypermitiría que la enumeración salga temprano en los casos en que hay valores diferentes?Allterminará tan pronto como llegue a un elementoxde la secuencia para la cualx.Value != val. De manera similar,Any(x => x.Value != val)terminaría tan pronto como golpee un elementoxde la secuencia para la cualx.Value != val. Es decir, ambosAllyAnyexhiben "cortocircuito" análogo a&&y||(que es efectivamente lo queAllyAnyson).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;Buena prueba rápida para todos iguales:
fuente
Class, aunque debería funcionar con estructuras. Sin embargo, genial para una lista de primitivas.collection.Distinct().Count() <= 1si desea permitir colecciones vacías..Distinct()no siempre funciona como se esperaba, especialmente cuando trabaja con objetos, consulte esta pregunta. En esos casos, debe implementar la interfaz IEquatable.Distinctno atravesará la colección en absoluto yCounthará un recorrido a travésDistinctdel iterador.Aunque ciertamente puede construir un dispositivo de este tipo a partir de operadores de secuencia existentes, en este caso me inclinaría a escribir este como un operador de secuencia personalizado. Algo como:
Eso es bastante claro, breve, cubre todos los casos y no crea innecesariamente iteraciones adicionales de la secuencia.
Convertir esto en un método genérico que funcione
IEnumerable<T>se deja como ejercicio. :-)fuente
othercuando ennullrealidad era la respuesta (presumiblemente) correcta. Digamos que la función eraT Unanimous<U, T>(this IEnumerable<U> sequence, T other)o alguna firma similar, eso lo complica un poco.O si le preocupa ejecutar First () para cada elemento (lo que podría ser un problema de rendimiento válido):
fuente
Esto puede llegar tarde, pero es una extensión que funciona tanto para los tipos de valor como de referencia según la respuesta de Eric:
fuente
fuente
Una alternativa al uso de LINQ:
He descubierto que el uso
HashSet<T>es más rápido para listas de hasta ~ 6000 enteros en comparación con:fuente
HashSet<T>inicialmente es más rápido que usar las declaraciones LINQ en mi respuesta. Sin embargo, si hago esto en un bucle, LINQ es más rápido.GetHashCode(), lo cual es difícil de hacer correctamente. Consulte: stackoverflow.com/a/371348/2607840 para obtener más detalles.Una ligera variación del enfoque simplificado anterior.
var result = yyy.Distinct().Count() == yyy.Count();fuente
Si una matriz es de tipo multidimensional como a continuación, tenemos que escribir a continuación linq para verificar los datos.
ejemplo: aquí los elementos son 0 y estoy comprobando que todos los valores son 0 o no.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
fuente