Сравнение равенства между несколькими переменными

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

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

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

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

Действительно ли это возможно в C#?

37
задан JPReddy 15 July 2010 в 10:54
поделиться

7 ответов

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

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

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

Instead of

if(v1 == 1 && v2 == 1 && v3 == 1 && v4 == 1 && v5 == 1 && v6 == 1 && v7 == 1 && v8 == 1 && v9== 1 && v10 == 1)
59
ответ дан 27 November 2019 в 04:03
поделиться
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;
}
0
ответ дан 27 November 2019 в 04:03
поделиться

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

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;
    }
}
4
ответ дан 27 November 2019 в 04:03
поделиться
if (x == y && y == z && z == 1)

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

10
ответ дан 27 November 2019 в 04:03
поделиться
if (x == y && y == z && z == 1)

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

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

x == (y == z)

|    |

int  bool

Я бы сделал следующее:

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)) { ... }
29
ответ дан 27 November 2019 в 04:03
поделиться

Если вы просто хотите подтвердить 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 , как в ответе Фенклиффа.

25
ответ дан 27 November 2019 в 04:03
поделиться

На самом деле у меня нет времени на код, но метод расширения с linq вроде этого

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

должен справиться.

Предупреждение: Этот код не тестировался и не был написан в среде IDE.

0
ответ дан 27 November 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: