C#代码:
我在数组中的1-100之间有20个随机数,程序应检查每个值是否唯一。现在我应该使用另一个方法,如果数组中只有唯一值,则返回true;如果数组中没有任何唯一值,则返回false。如果有人能帮助我,我将不胜感激。
答案 0 :(得分:8)
bool allUnique = array.Distinct().Count() == array.Count(); // or array.Length
或
var uniqueNumbers = new HashSet<int>(array);
bool allUnique = uniqueNumbers.Count == array.Count();
答案 1 :(得分:5)
@TimSchmelters的一个小替代品,可以提高效率:
public static bool AllUniq<T> (this IEnumerable<T> data) {
HashSet<T> hs = new HashSet<T>();
return data.All(hs.Add);
}
这基本上是生成for
循环:
public static bool AllUniq<T> (this IEnumerable<T> data) {
HashSet<T> hs = new HashSet<T>();
foreach(T x in data) {
if(!hs.Add(x)) {
return false;
}
}
return true;
}
从hs.Add
失败的那一刻起 - 因为该元素已经存在 - 该方法返回false
,如果找不到这样的对象,则返回true
。
这可以更快地工作的原因是它将从找到重复的那一刻起停止该过程,而先前讨论的方法首先构造唯一数字的集合然后比较大小。现在,如果迭代大量数字,构建整个不同列表可能是计算密集型的。
此外请注意,除了生成并测试到generate random distinct numbers之外,还有更聪明的方法。例如,交错生成和测试过程。一旦一个项目我必须以这种方式纠正生成的数独。结果是,在得到一个谜题之前,必须等待整整一天。
答案 2 :(得分:1)
这是一个非linq解决方案
for(int i=0; i< YourArray.Length;i++)
{
for(int x=i+1; x< YourArray.Length; x++)
{
if(YourArray[i] == YourArray[x])
{
Console.WriteLine("Found repeated value");
}
}
}