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
.Any
permitiría que la enumeración salga temprano en los casos en que hay valores diferentes?All
terminará tan pronto como llegue a un elementox
de la secuencia para la cualx.Value != val
. De manera similar,Any(x => x.Value != val)
terminaría tan pronto como golpee un elementox
de la secuencia para la cualx.Value != val
. Es decir, ambosAll
yAny
exhiben "cortocircuito" análogo a&&
y||
(que es efectivamente lo queAll
yAny
son).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() <= 1
si 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.Distinct
no atravesará la colección en absoluto yCount
hará un recorrido a travésDistinct
del 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
other
cuando ennull
realidad 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