如何检查我的数组中是否有重复的值?

所以这是我的arrays。

double[] testArray = new double[10]; // will generate a random numbers from 1-20, too lazy to write the code 

我想创建一个搜索循环来检查是否有重复的值。 我怎么做?

我宁愿不使用任何特殊的内置方法,因为这是一个小数组。

你可以用一点Linq做到这一点:

 if (testArray.Length != testArray.Distinct().Count()) { Console.WriteLine("Contains duplicates"); } 

Distinct扩展方法删除任何重复项, Count获取结果集的大小。 如果它们完全不同,那么列表中会有一些重复。

或者,这是更复杂的查询,但它可能更有效:

 if (testArray.GroupBy(x => x).Any(g => g.Count() > 1)) { Console.WriteLine("Contains duplicates"); } 

GroupBy方法将任何相同的元素组合在一起,如果任何组具有多个元素,则Any返回true

上述两种解决方案都可以通过使用HashSet ,但您可以直接使用它:

 if (!testArray.All(new HashSet().Add)) { Console.WriteLine("Contains duplicates"); } 

或者,如果您更喜欢完全不依赖于Linq的解决方案:

 var hashSet = new HashSet(); foreach(var x in testArray) { if (!hashSet.Add(x)) { Console.WriteLine("Contains duplicates"); break; } } 

通用扩展方法:

 public static bool HasDuplicate(this IEnumerable source, IEqualityComparer comparer) { if (source == null) throw new ArgumentException(nameof(source)); HashSet set = new HashSet(comparer); foreach (var item in source) if (!set.Add(item)) return true; return false; } 

用这个:

 bool CheckUniqueness(double[] values) { var uniqueValues = new HashSet(); foreach (double d in values) { if(uniqueValues.Contains(d)) { return false; } uniqueValues.Add(d); } return true; } 

看看我的实现它的genericefficient

 public static bool HasDuplicates(IList items) { Dictionary map = new Dictionary(); for (int i = 0; i < items.Count; i++) { if (map.ContainsKey(items[i])) { return true; // has duplicates } map.Add(items[i], true); } return false; // no duplicates } 

这里有一些电话

 string[] strings = new[] { "1", "2", "3" }; Utility.HasDuplicates(strings)// this will return false int[] items=new []{1,2,3,1}; Utility.HasDuplicates(items)// this will return true 

随着(OP)10个随机双打相当快。 重复的几率:~0.000002%。

 static bool repeat(double[] a) { return a[0] == a[1] || a[0] == a[2] || a[0] == a[3] || a[0] == a[4] || a[0] == a[5] || a[0] == a[6] || a[0] == a[7] || a[0] == a[8] || a[0] == a[9] || a[1] == a[2] || a[1] == a[3] || a[1] == a[4] || a[1] == a[5] || a[1] == a[6] || a[1] == a[7] || a[1] == a[8] || a[1] == a[9] || a[2] == a[3] || a[2] == a[4] || a[2] == a[5] || a[2] == a[6] || a[2] == a[7] || a[2] == a[8] || a[2] == a[9] || a[3] == a[4] || a[3] == a[5] || a[3] == a[6] || a[3] == a[7] || a[3] == a[8] || a[3] == a[9] || a[4] == a[5] || a[4] == a[6] || a[4] == a[7] || a[4] == a[8] || a[4] == a[9] || a[5] == a[6] || a[5] == a[7] || a[5] == a[8] || a[5] == a[9] || a[6] == a[7] || a[6] == a[8] || a[6] == a[9] || a[7] == a[8] || a[7] == a[9] || a[8] == a[9]; } 

更一般的,10个数字比上面慢2倍,
但比hashset方法快〜7倍。

 static bool repeat(double[] a) { int k = a.Length - 1; if (k < 70) { double aj; for (int i = 0, j; i < k; ) { for (aj = a[k--], j = k; j >= i; j--) if (aj == a[j]) return true; for (aj = a[i++], j = i; j <= k; j++) if (aj == a[j]) return true; } return false; } var h = new HashSet(); while (k >= 0) if (!h.Add(a[k--])) return false; return true; } 

两行(缓慢重复;)

 static bool repeat(double[] a) { return (new HashSet(a).Count < a.Length); } 

我们必须在第一个循环中从i初始化j并添加一个(i + 1),因为我们想要将第一个循环值与同一个数组的下一个值进行比较。

 int[] arr = new int[]{1,2,3,1,4,2,5,4}; //create one loop for arr values for (int i = 0; i < arr.Length; i++) { //create nested loop for compare current values with actual value of arr for (int j = i+1; j < arr.Length; j++) { //and here we put our condition if (arr[i] == arr[j]) { Console.WriteLine(arr[i]); } } }