superlativos superlativas superioridad oraciones operadores objetos logicos localecompare irregulares ingles igualdad español ejercicios ejemplos desigualdad comparativos comparativo comparativas comparar comparacion adjetivos c# comparison operators equality

c# - superlativas - Comparación de igualdad entre múltiples variables



operadores de comparacion javascript (14)

Tengo una situación en la que necesito verificar si múltiples variables tienen los mismos datos, como

var x=1; var y=1; var z=1;

Quiero verificar si x == 1 e y == 1 z == 1 (puede ser ''1'' o algún otro valor). en lugar de esto, ¿hay alguna manera de lograrlo?

if(x==y==z==1)

¿Es esto posible en C #?


Adapte la solución de Mau en un método de extensión. Sería bueno si agregaron esto al marco para todos los tipos de valores.

public static class IntegerExtensions { public static bool EqualsAll(this int subject, params int[] values) { if (values == null || values.Length == 0) { return true; } return values.All(v => v == subject); } }


Agrega esta extensión:

public static class Extensions { public static bool EqualsAll<T>(this T subject, params T[] values) => values == null || values.Length == 0 || values.All(v => v.Equals(subject)); }

Entonces llámalo así:

if(1.EqualsAll(x, y, z))


Aquí hay una pequeña y agradable solución recursiva que funciona con todos los tipos.

class Program { static void Main(string[] args) { int x = 4, y = 4, z = 4; Console.WriteLine(4.IsEqualToAllIn(x, y, z).ToString()); //prints True string a = "str", b = "str1", c = "str"; Console.WriteLine("str".IsEqualToAllIn(a, b, c).ToString()); //prints False } } public static class MyExtensions { public static bool IsEqualToAllIn<T>(this T valueToCompare, params T[] list) { bool prevResult = true; if (list.Count() > 1) prevResult = list[0].IsEqualToAllIn(list.Skip(1).ToArray()); return (valueToCompare.Equals(list[0])) && prevResult; } }


Así es como hice esto:

Debug.Assert(new List<int> { l1.Count, l2.Count, l3.Count, l4.Count }.TrueForAll( delegate(int value) { return value == l1.Count; }), "Tables have different size.");


En realidad no tengo tiempo para codificar, pero un método de extensión con linq como este

public bool EqualsToAll<T>(this T element, IEnumerable<T> source) { if(element == null) throw new ArgumentNullException(element); foreach(var item in source) { if(!element.Equals(item) return false; } return true; }

debería hacerlo.

Advertencia: este código no fue probado ni escrito dentro de un IDE.


KennyTM es correcto, no hay otra manera más simple o más eficiente.

Sin embargo, si tiene muchas variables, también puede crear una matriz de valores y usar el método IEnumerable.All para verificar que sean todos 1. Más legible, IMO.

if (new[] { v1, v2, v3, v4, v5, v6, v7, v8, v9, v10 }.All(x => x == 1))

En lugar de

if(v1 == 1 && v2 == 1 && v3 == 1 && v4 == 1 && v5 == 1 && v6 == 1 && v7 == 1 && v8 == 1 && v9== 1 && v10 == 1)


Ligera variación en la excelente respuesta dada por jevakallio arriba. Vea si myValue es igual a cualquiera de los valores en una lista (en la matriz):

if (new[] { 10, 11, 12 }.Any(x => x == myValue))


Para tipos integrales, ¿qué pasa con:

int x = 3, y = 3, z = 3; if((x & y & z & 3) == 3) //...have same data

para probar cualquier valor distinto de cero . Necesitaría más controles para hacer de esto una función reutilizable. Pero podría funcionar para verificaciones en línea de igualdad distinta de cero, como describió el OP.


Si solo quieres testif x == y == z puedes usar:

var allEqual = new[] {x, y, z}.Distinct().Count() == 1;

Si quiere probar si todos son iguales a 1, agregue 1 al conjunto:

var allEqual1 = new[] {x, y, z, 1}.Distinct().Count() == 1;

o use All como en la respuesta de Fencliff.


XOR podría funcionar para usted, por ejemplo, dado:

var x=1; var y=1; var z=1;

Entonces

x ^ y ^ z == 0

Es verdad

-edit- Si desea verificar si todos los valores son iguales y su valor es 1, use:

x ^ y ^ z ^ 1 == 0


if (x == y && y == z && z == 1)

No hay otras formas simples o más eficientes.


if (x == y && y == z && z == 1)

es lo mejor que puedes hacer, porque

y == z evalúa a booleano y no puede comparar x con el resultado:

x == (y == z) | | int bool

Yo haría esto:

public bool AllEqual<T>(params T[] values) { if(values == null || values.Length == 0) return true; return values.All(v => v.Equals(values[0])); } // ... if(AllEqual(x, y, z)) { ... }


public static bool AllSame<T>(List<T> values) { return values.Distinct().Count() == 1; } public static bool AllDifferent<T>(List<T> values) { return values.Distinct().Count() == values.Count; }


var x = 1; var y = 1; var z = 1; if (AllEqual(1, x, y, z)) // true if (AllEqual(2, x, y, z)) // false if (AllEqual(x, y, z)) // true var a = 1; var b = 2; var c = 3; if (AllEqual(a, b, c)) // false // ... public static bool AllEqual<T>(params T[] values) { if (values == null) throw new ArgumentNullException("values"); if (values.Length < 1) throw new ArgumentException("Values cannot be empty.", "values"); T value = values[0]; for (int i = 1; i < values.Length; i++) { if (!value.Equals(values[i])) return false; } return true; }