用C#链接bool

时间:2010-01-07 11:11:54

标签: c# .net

int a, b, c, d, e;
a = b = c = d = e = 1;

if ((a==b) && (b==c) && (c==d) && (d==e))
{
    Console.WriteLine("that syntax is horrible");
}

是否有更优雅的方法来测试上面的多重相等?

也许是AreEqual(params obj[])或其他什么?我有一个谷歌,但没有找到任何东西。

5 个答案:

答案 0 :(得分:10)

AreEqual(params object[] objects)的可能实现:

(根据Jon Skeet的建议,这是一个通用版本)

bool AreEqual<T>(params T[] objects)
{
    if (objects.Length <= 1) return true;
    return objects.Skip(1).All(x => x.Equals(objects[0]));
}

Skip(1)也不是必需的。

答案 1 :(得分:4)

这是一个通用版本,它将避免装箱(在编译时更加类型安全):

public static bool AllEqual<T>(T firstItem, params T[] items)
{
    // Omitted error checking
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    foreach (T item in items)
    {
        if (!comparer.Equals(firstItem, item))
        {
            return false;
        }
    }
    return true;
}

请注意,如果你真的想传递一组你已经在数组中获得的值,这将不会那么方便,但是避免了空数组的问题 - 并且意味着你没有任何冗余的比较。 / p>

答案 2 :(得分:3)

不,这是最合理的方式(我的意思是最可读,这是最重要的)。

真正的问题是,你为什么要这样做?首先,这似乎是一个糟糕的设计......

答案 3 :(得分:0)

如果您要比较简单类型并且只有一些用例,那么您可以创建一些实用方法,例如:

    bool AllEqual(int first, params int[] numbers)
    {
        return numbers.All(x => x == first);
    }

答案 4 :(得分:0)

<击> 这很有趣

int a, b, c, d, e;
a = b = c = d = e = 1;

if ((a & b & c & d) == e)
{
    Console.WriteLine("that syntax is horrible");
}

<击>

这可能更好

int a, b, c, d, e;
a = b = c = d = e = 1;
if (new[] {a, b, c, d, e}.All(i => i == a))
{
    Console.WriteLine("Funky chicken");
}