[英]How do I check if my array has repeated values inside it?
So here is my array.所以这是我的数组。
double[] testArray = new double[10];
// will generate a random numbers from 1-20, too lazy to write the code
I want to make a search loop to check if any values are being repeated.我想做一个搜索循环来检查是否有重复的值。 How do I do that?
我怎么做?
I would prefer not to use any special built-in methods since this is a small array.我不想使用任何特殊的内置方法,因为这是一个小数组。
You could do this with a little Linq:你可以用一个小的 Linq 来做到这一点:
if (testArray.Length != testArray.Distinct().Count())
{
Console.WriteLine("Contains duplicates");
}
The Distinct
extension method removes any duplicates, and Count
gets the size of the result set. Distinct
扩展方法删除任何重复项, Count
获取结果集的大小。 If they differ at all, then there are some duplicates in the list.如果它们完全不同,则列表中有一些重复项。
Alternatively, here's more complicated query, but it may be a bit more efficient:或者,这里有更复杂的查询,但它可能更有效:
if (testArray.GroupBy(x => x).Any(g => g.Count() > 1))
{
Console.WriteLine("Contains duplicates");
}
The GroupBy
method will group any identical elements together, and Any
return true
if any of the groups has more than one element. GroupBy
方法将任何相同的元素组合在一起,如果任何组有多个元素,则Any
返回true
。
Both of the above solutions work by utilizing a HashSet<T>
, but you can use one directly like this:上述两种解决方案都通过使用
HashSet<T>
,但您可以像这样直接使用一个:
if (!testArray.All(new HashSet<double>().Add))
{
Console.WriteLine("Contains duplicates");
}
Or if you prefer a solution that doesn't rely on Linq at all:或者,如果您更喜欢完全不依赖 Linq 的解决方案:
var hashSet = new HashSet<double>();
foreach(var x in testArray)
{
if (!hashSet.Add(x))
{
Console.WriteLine("Contains duplicates");
break;
}
}
take look at my implementation its generic
and efficient
看看我的实现,它的
generic
和efficient
public static bool HasDuplicates<T>(IList<T> items)
{
Dictionary<T, bool> map = new Dictionary<T, bool>();
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
}
here are some calls这里有一些电话
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
Use this:用这个:
bool CheckUniqueness(double[] values)
{
var uniqueValues = new HashSet<double>();
foreach (double d in values)
{
if(uniqueValues.Contains(d))
{
return false;
}
uniqueValues.Add(d);
}
return true;
}
We must initialize j
from i
on the first loop and add one(i+1) because we want to compare first loop value with the next value of same array.我们必须在第一个循环中从
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]);
}
}
}
With (OP) 10 random doubles quite fast.使用 (OP) 10 随机加倍非常快。 The chance of a repeat: ~0.000002 %.
重复的几率:~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];
}
More general, with 10 numbers ~2 times slower than above,更一般的,10个数字比上面慢2倍,
but ~7 times faster than the hashset approach.但比 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<double>();
while (k >= 0) if (!h.Add(a[k--])) return false;
return true;
}
Two lines (slow with a repeat ;)两行(慢速重复;)
static bool repeat(double[] a)
{ return (new HashSet<double>(a).Count < a.Length); }
Generic extension method :通用扩展方法:
public static bool HasDuplicate<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer)
{
if (source == null)
throw new ArgumentException(nameof(source));
HashSet<T> set = new HashSet<T>(comparer);
foreach (var item in source)
if (!set.Add(item))
return true;
return false;
}
use a hashset to add members to, then check if there a previous occurrence of current member使用散列集添加成员,然后检查是否存在当前成员的先前出现
public bool ContainsDuplicate(double[] nums)
{
int size = nums.Length;
HashSet<double> set1 = new HashSet<double>();
for (int i = 0; i < size; i++)
{
if (set1.Contains(nums[i]))
{
return true;
}
else
{
set1.Add(nums[i]);
}
}
return false;
}
int[] nums = new int[] { 1, 2, 3, 4, 5};
Console.WriteLine(AnyDuplicate(nums));
}
/// <summary>
/// Returns true if there is at least a duplicate in the array.
/// </summary>
/// <returns></returns>
static bool AnyDuplicate(int[] numbers)
{
for (int i = 0; i < numbers.Length; i++)
{
for (int j = i + 1; j < numbers.Length; j++)
{
if (numbers[i] == numbers[j])
{
return true;
}
}
}
return false;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.