多个变量之间的平等比较

时间:2010-07-15 10:54:26

标签: c# comparison operators equality

我需要检查多个变量是否具有相同的数据,例如

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

我想检查x == 1和y == 1 z == 1(它可能是'1'或其他值)。而不是这个,是否有任何简短的方法,我可以实现相同,如下面

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

这在C#中是否可行?

14 个答案:

答案 0 :(得分:56)

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)

答案 1 :(得分:28)

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)) { ... }

答案 2 :(得分:25)

如果你只想测试x == y == z,你可以使用:

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

如果您想测试它们是否都等于1,请在集合中添加1:

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

或在fencliff的回答中使用All

答案 3 :(得分:9)

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

没有其他简单或更有效的方式。

答案 4 :(得分:4)

这是一个很好的小递归解决方案,适用于所有类型。

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

答案 5 :(得分:4)

对于整数类型,那么:

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

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

用于测试任何非零值。 需要更多检查才能使其成为可重复使用的功能。但正如OP所描述的那样,可能适用于非零相等的内联检查。

答案 6 :(得分:3)

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

答案 7 :(得分:1)

XOR可能适合您,例如给出:

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

然后

x ^ y ^ z == 0

是真的

CNC中 如果要检查所有值是否相同且值是否为1,请使用:

x ^ y ^ z ^ 1 == 0

答案 8 :(得分:1)

添加此扩展程序:

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

答案 9 :(得分:0)

实际上我没有时间编写代码,而是像这样使用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中编写。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

我将Mau的解决方案改编为扩展方法。如果他们将这个添加到所有值类型的框架中会很好。

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

答案 12 :(得分:0)

我是这样做的:

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.");

答案 13 :(得分:0)

上面的jevakallio给出的优秀答案略有不同。查看myValue是否等于列表中的任何值(在数组中):

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