C# 如何检查随机值是否唯一?

C# 如何检查随机值是否唯一?,c#,arrays,random,numbers,C#,Arrays,Random,Numbers,C#代码: 我在一个数组中有20个介于1-100之间的随机数,程序应该检查每个值是否唯一。现在我应该使用另一个方法,如果数组中只有唯一值,则返回true;如果数组中没有任何唯一值,则返回false。如果有人能帮我,我将不胜感激 bool allUnique = array.Distinct().Count() == array.Count(); // or array.Length 或 var uniqueNumbers=新哈希集(数组); bool allUnique=uniqueNumbe

C#代码:

我在一个数组中有20个介于1-100之间的随机数,程序应该检查每个值是否唯一。现在我应该使用另一个方法,如果数组中只有唯一值,则返回true;如果数组中没有任何唯一值,则返回false。如果有人能帮我,我将不胜感激

bool allUnique = array.Distinct().Count() == array.Count(); // or array.Length

var uniqueNumbers=新哈希集(数组);
bool allUnique=uniqueNumbers.Count==array.Count();

是@TimSchmelters的一个小型替代方案,它提供了一个非常好的答案,可以运行得更加高效:

public static bool AllUniq<T> (this IEnumerable<T> data) {
    HashSet<T> hs = new HashSet<T>();
    return data.All(hs.Add);
}
从失败的那一刻起(这是因为元素已经存在),该方法返回
false
,如果找不到这样的对象,则返回
true

这可以更快地工作的原因是,它将从发现重复的那一刻起停止该过程,而前面讨论的方法首先构造唯一数字的集合,然后比较大小。现在,如果您迭代大量的数字,那么构建整个不同的列表可能需要大量的计算


此外,请注意,还有比生成和测试更聪明的方法。例如,交错生成和测试过程。曾经有一个项目,我不得不用这种方式纠正生成的数独。结果是,人们不得不等上整整几天才想出一个谜题。

这里有一个非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");
        }
    }   
  }
for(int i=0;i
提示:查看
Distinct()
对数组中的元素进行计数,然后对数组中的不同元素进行计数并比较两个值。你可以用林克来做这个。@GrantWinney:那没关系。使用Linq,它将使用可重写的
Equals
方法。做你自己的家庭作业,否则你将学不到任何东西@格兰特妮:你当然可以。数组
T[]
继承自
IEnumerable
。。。您只需要使用System.Linq编写
:我甚至更喜欢这种方法,而不是mineTim的方法。如果
数据
实现
ICollection
,则该方法可能会稍微快一点,如果源可枚举项实现了
ICollection
@ScottChamberlain,则接受
IEnumerable
以预先调整其内部存储大小的构造函数:如果没有重复项,则是。如果存在重复项(平均情况下,它可能会快一点。优化在于立即中断处理。但是如果没有重复项,它确实会导致O(log n)偶尔重新组织
哈希集的开销。这种方法有效,但效率较低,因为它在时间上是二次的,而
哈希集
-方法(如
Distinct()
)的平均时间复杂度为O(n),有时(取决于
哈希集
的实现)的保证复杂度为O(n log n)有些东西告诉我这是做家庭作业的。@Commusoft您可以/应该仍然使用哈希集并节省大量时间,您仍然可以通过将内部
for
循环替换为
if(hs.Add(YourArray[i])使其成为“非Linq”
@ScottChamberlain如果你把它作为一个答案发布,我会投票表决。不,我不会。这个答案只是将CommuSoft答案中的LINQ扩展为一个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;
}
  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");
        }
    }   
  }