Foreach列表搜索没有重复

时间:2017-01-15 14:37:55

标签: c# list search foreach repeat

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

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);
    }
}

5 个答案:

答案 0 :(得分:1)

下面的代码创建数字列表而不重复。解决问题的关键是使用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);  
        }
    }

答案 1 :(得分:0)

您应检查此号码是否先前已生成,如果重复则生成另一个号码。

改变这个:

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);
    }
}

答案 2 :(得分:0)

您可以执行此操作,您可以查看我的评论其他详细信息:

 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);
                }
        }

答案 3 :(得分:0)

如果你想要没有复制的数字, 我认为使用HashSet会更好。

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

或者如果您确实需要List,则可以使用辅助方法 类似的东西:

  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;

    }

答案 4 :(得分:0)

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

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

说明:

Enumerable.Range(0, 20)将返回IEnumerable<int>,其数字为0到19.

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

Take(10)将返回IEnumerable<int>

中的前10个数字

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