C# 如何检查我的数组中是否有重复的值?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19757992/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I check if my array has repeated values inside it?
提问by puretppc
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.
我不想使用任何特殊的内置方法,因为这是一个小数组。
采纳答案by p.s.w.g
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. If they differ at all, then there are some duplicates in the list.
该Distinct
扩展方法除去任何重复,并且Count
得到的结果集的大小。如果它们完全不同,则列表中有一些重复项。
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:
上述两种解决方案都通过使用 a 来工作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;
}
}
回答by helb
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;
}
回答by P_P
With (OP) 10 random doubles quite fast. The chance of a repeat: ~0.000002 %.
使用 (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];
}
More general, with 10 numbers ~2 times slower than above,
but ~7 times faster than the hashset approach.
更一般的,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<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); }
回答by Basheer AL-MOMANI
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
回答by Javidan Akberov
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.
我们必须j
从i
第一个循环开始并添加一个(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]);
}
}
}
回答by Ali Bayat
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;
}
回答by John Tigire
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;
回答by Wesam
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;
}