在最少数量的比较中比较5个整数

时间:2009-10-21 18:52:24

标签: c# algorithm

我有这段代码,需要确保所有结果变量都相等吗?

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

感谢。

9 个答案:

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