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;
}