假设我有五个整数值,它们都必须是唯一的。
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
但在我看来,这会导致代码非常混乱。有没有一种“更清洁”的方式来做到这一点?
您可以将所有值放入一个集合中,并确保该集合的基数等于您放入的值的数量:
ISet<int> vals = new HashSet<int> {
a, b, c, d, e
};
if (vals.Count != 5) {
Console.WriteLine("All values must be unique");
}
可能有点开销,但你可以这样做:
new [] {a, b, c, d, e}.Distinct().Count() == 5
未经测试,但您也可以制作这样的辅助方法:
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)
List<int>() list = new List<int>(){a,b,c,d,e};
bool unique = list.Count() == list.Distinct().Count();
由于您一次只比较两个值,因此您将拥有 (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.
List<int> elements = new List<int>(){a,b,c,d,e};
if (elements.Distinct().Count() == elements.Count)
{
//all elements are different
}
else
{
}
清洁度可能会引起争议,但是如果您对它们进行排序,那么(根据需要)比较您所在的每个相邻对(n lg n)而不是(n^2)。