确保一组价值观都是独一无二的最简洁方法是什么?

时间:2012-10-16 13:22:21

标签: c# logic

假设我有五个必须全部唯一的整数值。

int a;
int b;
int c;
int d;
int e;

显然我可以做这样的事情来测试:

if (a == b) {
    return false;
} else if (a == c) {
    return false;
} else if (a == d) {
    return false;
}
//etc etc

但在我看来,这会造成极其混乱的代码。是否有“更清洁”的方法来做到这一点?

7 个答案:

答案 0 :(得分:6)

您可以将所有值放在一个集合中,并确保该集合的基数等于您放入的值的数量:

ISet<int> vals = new HashSet<int> {
    a, b, c, d, e
};
if (vals.Count != 5) {
    Console.WriteLine("All values must be unique");
}

答案 1 :(得分:3)

可能有点开销,但你可以这样做:

new [] {a, b, c, d, e}.Distinct().Count() == 5

答案 2 :(得分:2)

List<int>() list = new List<int>(){a,b,c,d,e};

bool unique = list.Count() == list.Distinct().Count();

答案 3 :(得分:2)

未经测试,但你也可以制作一个这样的辅助方法:

static bool AreDistinct<T>(params T[] vals)
{
    for(int i = 0; i < vals.Length - 1; i++)
        for(int j = i + 1; j < vals.Length; j++)
            if(vals[i].Equals(vals[j]))
                return false;

    return true;
}

并称之为:

AreDistinct(a, b, c, d, e)

答案 4 :(得分:1)

List<int> elements = new List<int>(){a,b,c,d,e};
if (elements.Distinct().Count() == elements.Count)
{
    //all elements are different
}
else
{

}

答案 5 :(得分:1)

由于您一次只比较两个值,因此您将拥有(n-1)!比较。

你应该考虑Ic。的回答。他将j的值偏移j为+1,以避免冗余比较。这就是它的简洁和高效。

但是,如果你必须写出比较:

if (a == b || a == c || a == d || a == e)
    return false;

if (b == c || b == d || b == e)
    return false;

//etc.

答案 6 :(得分:0)

清洁度可能存在争议,但如果你对它们进行排序,那么(根据需要)比较你所在的每个相邻对(n lg n)而不是(n ^ 2)。