Confronto di uguaglianza tra più variabili

Ho una situazione in cui ho bisogno di verificare se più variabili stanno avendo gli stessi dati come

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

Voglio controllare se x == 1 ey == 1 z == 1 (potrebbe essere ‘1’ o qualche altro valore). invece di questo, c’è un modo breve per ottenere lo stesso come di seguito

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

È ansible in C #?

KennyTM è corretto, non c’è altro modo più semplice o più efficiente.

Tuttavia, se si dispone di molte variabili, è anche ansible creare un array di valori e utilizzare il metodo IEnumerable.All per verificare che siano tutti 1. Più leggibile, IMO.

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

Invece di

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

è il meglio che puoi fare, perché

y == z restituisce un valore booleano e non puoi confrontare x con il risultato:

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

Lo farei:

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

Se vuoi solo testif x == y == z puoi usare:

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

Se vuoi verificare se sono tutti uguali a 1, aggiungi 1 al set:

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

oppure usa All come nella risposta di fencliff.

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

Non ci sono altri modi semplici o più efficienti.

Per i tipi interi, che dire di:

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

per testare qualsiasi valore diverso da zero . Avrebbe bisogno di più controlli per rendere questa una funzione riutilizzabile. Ma potrebbe funzionare per i controlli in linea dell’uguaglianza diversa da zero, come descritto dall’OP.

Ecco una piccola soluzione ricorsiva che funziona con tutti i tipi.

 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(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; } } 
 public static bool AllSame(List values) { return values.Distinct().Count() == 1; } public static bool AllDifferent(List values) { return values.Distinct().Count() == values.Count; } 

XOR potrebbe funzionare per te, ad esempio dato:

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

Poi

 x ^ y ^ z == 0 

È vero

-edit- Se vuoi controllare se tutti i valori sono uguali e il loro valore è 1, usa:

 x ^ y ^ z ^ 1 == 0 

Aggiungi questa estensione:

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

Quindi chiamalo così:

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

In realtà non ho il tempo di programmare, ma un metodo di estensione con linq come questo

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

dovrebbe farlo

Avviso: questo codice non è stato testato, né scritto all’interno di un IDE.

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

Ho adattato la soluzione di Mau in un metodo di estensione. Sarebbe bello se lo aggiungessero al framework per tutti i tipi di valore.

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

Ecco come ho fatto questo:

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

Leggera variazione sull’eccellente risposta data da jevakallio sopra. Verifica se myValue è uguale a uno qualsiasi dei valori di un elenco (nell’array):

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