views:

68

answers:

7

I've a situation where I need to check whether multiple variables are having same data such as

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

I want to check whether x==1 and y==1 z==1 (it may be '1' or some other value). instead of this, is there any short way I can achieve same such as below

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

Is this possible in C#?

+4  A: 
if (x == y && y == z && z == 1)

There's no other simpler and more efficient ways.

KennyTM
Sorry to say that I'm not expecting this answer as even I know I can achieve it with such 3 expression check. My question might not be clear enough. I wanted to achieve this in single expression as I stated above without And operator. Anyway thanks for clarifying that there is no simpler way.
JPReddy
+5  A: 
if (x == y && y == z && z == 1)

is the best you can do, because

y == z evaluates to a boolean and you can't compare x with the result:

x == (y == z)

|    |

int  bool

I would do this:

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)) { ... }
Mau
Nice solution! 1+
bassfriend
+4  A: 

KennyTM is correct, there is no other simpler or more efficient way.

However, if you have many variables, you could also build an array of the values and use the IEnumerable.All method to verify they're all 1. More readable, 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)
fencliff
Excellent, this is exactly what I was expecting. Thanks for the answer.
JPReddy
A: 

Actually i don't have to the time to code, but an extension method with linq like this

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

should make it.

Warning: This code was not tested, nor written within an IDE.

Oliver
+1  A: 

Here's a nice little recursive solution that works with all types.

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;
    }
}
this. __curious_geek
+2  A: 

If you just want to testif x == y == z you can use:

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

If you want to test if they're all equal to 1, add 1 to the set:

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

or use All as in fencliff's answer.

Jamie Ide
+1. brilliant. I'd accept this answer. It's not how much you know, it's all about how well you know whatever you already know. My answer looks silly in front of this.
this. __curious_geek
I would have selected your answer as well, if there is a chance to select more than one answer.
JPReddy
A: 
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;
}
LukeH