Сравнение равенства между несколькими переменными - PullRequest
36 голосов
/ 15 июля 2010

У меня есть ситуация, когда мне нужно проверить, имеют ли несколько переменных одинаковые данные, например

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

Я хочу проверить, x == 1 и y == 1 z == 1 (это может быть «1» или другое значение).вместо этого, есть ли какой-нибудь короткий путь, которым я могу достичь того же, что и ниже

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

Возможно ли это в C #?

Ответы [ 14 ]

57 голосов
/ 15 июля 2010

KennyTM верен, другого более простого или эффективного способа не существует.

Однако, если у вас много переменных, вы также можете создать массив значений и использовать метод IEnumerable.All, чтобы убедиться, что они все 1. Более читабельные, IMO.

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

Вместо

if(v1 == 1 && v2 == 1 && v3 == 1 && v4 == 1 && v5 == 1 && v6 == 1 && v7 == 1 && v8 == 1 && v9== 1 && v10 == 1)
28 голосов
/ 15 июля 2010
if (x == y && y == z && z == 1)

- лучшее, что вы можете сделать, потому что

y == z оценивается как логическое значение, и вы не можете сравнить x с результатом:

x == (y == z)

|    |

int  bool

Iсделает это:

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)) { ... }
25 голосов
/ 15 июля 2010

Если вы просто хотите дать показания x == y == z, вы можете использовать:

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

Если вы хотите проверить, все ли они равны 1, добавьте 1 к набору:

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

или используйте All как в ответе Фенклиффа.

9 голосов
/ 15 июля 2010
if (x == y && y == z && z == 1)

Других простых или более эффективных способов не существует.

4 голосов
/ 22 марта 2015

Для целочисленных типов, как насчет:

int x = 3, y = 3, z = 3;

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

для проверки любого ненулевого значения. Потребуется больше проверок, чтобы сделать эту функцию многократно используемой. Но может работать для встроенных проверок ненулевого равенства, как описано в OP.

4 голосов
/ 15 июля 2010

Вот милое рекурсивное решение, которое работает со всеми типами.

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;
    }
}
3 голосов
/ 23 июля 2014
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;
}
1 голос
/ 20 мая 2017

Добавить это расширение:

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

Тогда назовите это так:

if(1.EqualsAll(x, y, z))
1 голос
/ 03 ноября 2016

XOR может работать для вас, например, с учетом:

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

Тогда

x ^ y ^ z == 0

Верно

-edit- Если вы хотите проверить, все ли значенияодинаковы и их значение равно 1, используйте:

x ^ y ^ z ^ 1 == 0
0 голосов
/ 03 ноября 2016

Небольшое отклонение от превосходного ответа, данного Джевакаллио выше. Посмотрите, равно ли myValue любому из значений в списке (в массиве):

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