2

假设我有五个整数值,它们都必须是唯一的。

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

但在我看来,这会导致代码非常混乱。有没有一种“更清洁”的方式来做到这一点?

4

7 回答 7

6

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

ISet<int> vals = new HashSet<int> {
    a, b, c, d, e
};
if (vals.Count != 5) {
    Console.WriteLine("All values must be unique");
}
于 2012-10-16T13:23:46.250 回答
3

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

new [] {a, b, c, d, e}.Distinct().Count() == 5
于 2012-10-16T13:25:06.030 回答
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)
于 2012-10-16T13:33:59.873 回答
2
List<int>() list = new List<int>(){a,b,c,d,e};

bool unique = list.Count() == list.Distinct().Count();
于 2012-10-16T13:26:50.217 回答
1

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

你真的应该考虑 Ic. 的回答。他将 j 偏移 i 的值 +1 以避免冗余比较。这是尽可能简洁和有效的。

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

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

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

//etc.
于 2012-10-16T13:39:08.450 回答
1
List<int> elements = new List<int>(){a,b,c,d,e};
if (elements.Distinct().Count() == elements.Count)
{
    //all elements are different
}
else
{

}
于 2012-10-16T13:25:42.413 回答
0

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

于 2012-10-17T18:35:18.877 回答