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[])
或其他什么?我有一个谷歌,但没有找到任何东西。
答案 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");
}