Foreach 列表搜索不重复

Foreach list search without repetition

如何将随机数放入列表而不重复? 这是我的代码,有时数字会重复但我不知道为什么

Random losowa = new Random();
List<int> pula = new List<int>();

private void LosujPytania()
{            
    int a = losowa.Next(1,20);
    while (pula.Count < 10)
    {
        foreach (int i in pula)
        {
            if (a == i)
            {
                a = losowa.Next(1, 20);
                break;
            }

        }
        pula.Add(a);
    }
}

您应该检查一下这个号码之前是否生成过,如果重复则生成另一个号码。

改变这个:

private void LosujPytania()
{            
    int a = losowa.Next(1,20);
    while (pula.Count < 10)
    {
        foreach (int i in pula)
        {
            if (a == i)
            {
                a = losowa.Next(1, 20);
                break;
            }
        }
        pula.Add(a);
    }
}

通过这个:

private void LosujPytania()
{            
    int a = losowa.Next(1,20);
    pula.Add(a);
    while (pula.Count < 10)
    {
        do
        {
            a = losowa.Next(1, 20);
        } while(pula.Contains(a));

        pula.Add(a);
    }
}

下面的代码创建没有重复的数字列表。解决问题的关键是使用 list.Contains()

    using System;
    using System.Collections.Generic;

    public class Program
    {
        public static void Main()
        {
            var list = new List<int>();             
            var rand = new Random();

            while(list.Count <10)
            {
                var number = rand.Next(1,20);

                if(! list.Contains(number))
                    list.Add(number);               
            }

            foreach(var item in list)           
                Console.WriteLine(item);  
        }
    }

你可以这样做,你可以查看我的评论其他详细信息:

 private static void LosujPytania()
            {         

        Random losowa = new Random();
        List<int> pula = new List<int>();

                int a = losowa.Next(1,20);
                while (pula.Count < 10)
                {
                    //Your code is not really checking for duplicates so I replace it with boolean condition below
                    //foreach (int i in pula)
                    //{
                    //    if (a == i)
                    //    {
                    //        a = losowa.Next(1, 20);
                    //        break;
                    //    }

                    //}

                    a = losowa.Next(1, 20);
                    //This will check if your list doesn't contain your numbers yet before adding to make sure everything is unique
                    if (!pula.Contains(a))
                    pula.Add(a);
                }
        }

如果你想要没有重复的数字, 我觉得用HashSet会更好

            Random losowa = new Random();
            HashSet<int> pula = new HashSet<int>();
            while (pula.Count < 10)
            {
                pula.Add(r.Next(20));
            }

或者如果你真的需要列表,你可以使用辅助方法 类似于:

  private void LosujPytania()
    {
        Random losowa = new Random();
        List<int> pula = new List<int>();
        int a = losowa.Next(1, 20);
        pula.AddRange(Get10RandomNumbers(losowa));
    }

    private IEnumerable<int> Get10RandomNumbers(Random losowa)
    {
        HashSet<int> ints = new HashSet<int>();   
        while (ints.Count < 10)
        {
            ints.Add(losowa.Next(20));
        }
        return ints;

    }

一个简单的两行解决方案:

var rnd = new Random();
var list = Enumerable.Range(0, 20).OrderBy(x => rnd.Next()).Take(10).ToList();

解释:

Enumerable.Range(0, 20) 将 return 一个 IEnumerable<int>,数字为 0 到 19。

OrderBy(x => rnd.Next()) 会将值排序为随机顺序。

Take(10) 将 return 来自 IEnumerable<int>,

的前 10 个数字

最后,ToList() 将 return 这些 int 值的列表。