我有这段代码,需要确保所有结果变量都相等吗?
long result1 = timer.CalculateElapsedTimeInMinutes();
long result2 = timer.CalculateElapsedTimeInMinutes();
long result3 = timer.CalculateElapsedTimeInMinutes();
long result4 = timer.CalculateElapsedTimeInMinutes();
long result5 = timer.CalculateElapsedTimeInMinutes();
这就是我所做的,但我觉得它可以用更简单的方式完成,也许不是吗?
bool allEqual = (result1 == result2) && (result3 == result4) && (result1 == result3) && (result1 == result5);
感谢。
答案 0 :(得分:14)
只是关于可能有一些hacky /聪明的比特笨拙的方式用XOR或其他东西做这个 - 但是你的代码清楚地说明了你想做什么,并且仍然会非常快。这成为瓶颈的可能性接近于0,不值得考虑IMO - 所以请使用最易读的代码。
尽管如此,我会在你的比较中更加一致:
bool allEqual = (result1 == result2) &&
(result1 == result3) &&
(result1 == result4) &&
(result1 == result5);
从视觉上看,你已经涵盖了所有的基础,IMO。
答案 1 :(得分:5)
不,你至少需要 n -1比较。虽然我这样写:
bool allEqual = (result1 == result2)
&& (result2 == result3)
&& (result3 == result4)
&& (result4 == result5);
答案 2 :(得分:2)
不,这非常完美。
一切都应尽可能简单,但并不简单。 - 阿尔伯特爱因斯坦
答案 3 :(得分:2)
您也可以使用All扩展方法使用链接执行此操作。
var results = new long[] {
timer.CalculateElapsedTimeInMinutes(),
timer.CalculateElapsedTimeInMinutes(),
timer.CalculateElapsedTimeInMinutes(),
timer.CalculateElapsedTimeInMinutes(),
timer.CalculateElapsedTimeInMinutes()
};
bool allEqual = results.All(x => x == results[0]);
答案 4 :(得分:1)
可能更快的唯一方法是将其短路,以便首先评估最可能不同的对。
答案 5 :(得分:1)
只是为了它,它会工作吗?
bool allequal =
res1 & res2 & res3 & res4 & res5 ==
res1 | res2 | res3 | res4 | res5;
只有一个比较... <grin>
(如果你不计算按位运算!)
答案 6 :(得分:0)
使用LINQ:
var firstValue = timer.CalculateElapsedTimeInMinutes();
var list = new List<long>();
list.Add(timer.CalculateElapsedTimeInMinutes());
list.Add(...);
bool allEqual = list.All(i => i == firstValue);
答案 7 :(得分:0)
这取决于您的比较意思。您只能使用一个显式比较运算符来执行此操作:
bool result =
((result1 ^ reesult2) | (result1 ^ result3) | (result1 ^ result4) | (result1 ^ result5))==0;
这个可能甚至在生成的代码中具有优势 - 使用逻辑的代码,并且一旦找到任何不相等的值就需要停止进行比较。这意味着每个比较必须单独完成,并且必须包含在每次比较后退出测试的代码。
然而,除非你在一个非常紧凑的循环中这样做,否则它是不值得的 - 只要做你认为最可读的东西。
答案 8 :(得分:0)
您还可以为此创建一个辅助函数:
bool AllEqual<T>(params T[] values) where T : IEquatable<T> {
// make a decision here and document it
if (values.Length < 1) return true; // I guess?
bool result = true;
T first = values[0];
for (int i = 1; i < values.Length; i++) {
result = result && first.Equals(values[i]);
}
return result;
}