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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 15:47:45  来源:igfitidea点击:

How do I check if my array has repeated values inside it?

c#arraysrepeat

提问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 Distinctextension method removes any duplicates, and Countgets 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 GroupBymethod will group any identical elements together, and Anyreturn trueif 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 genericand efficient

看看我的实现它genericefficient

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 jfrom ion the first loop and add one(i+1) because we want to compare first loop value with the next value of same array.

我们必须ji第一个循环开始并添加一个(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;
}