如何检查我的数组中是否有重复的值?
所以这是我的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; }
看看我的实现它的generic
和efficient
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]); } } }