仅当其他列表中不存在随机数时,才将随机数放入列表中

本文关键字:列表 随机数 不存在 其他 | 更新日期: 2023-09-27 18:19:28

我还有另一个名为lRVars的列表

我正在尝试使用从循环生成的 hashSet 生成另一个列表,如下所示,但是,我需要确保上面的列表中尚不存在该数字:

List<int> lCVars = new List<int>();
HashSet<int> hCVars = new HashSet<int>();
        while (hCVars.Count < randCVarsCount)         
        {
            hCVars.Add(rnd.Next(1, 11));
        }  
        lColVars = hsColVars.ToList();

所以在上面的循环中,我需要检查rnd.Next是否已经存在于正在比较的列表中并且无法弄清楚语法。

多一只眼睛会很棒。

仅当其他列表中不存在随机数时,才将随机数放入列表中

你只需要一个随机数的临时变量,并用它来检查它是否已经存在。

您可以添加一个 else 子句,并且仅在它尚未HashSet中时才将其添加到 中,但 Add 方法这样做(即 hs.Add(8); hs.Add(8); //hs will only have count of 1 (

List<int> lCVars = new List<int>();
HashSet<int> hCVars = new HashSet<int>();
var rnd = new Random();
var randCVarsCount = 5;
while (hCVars.Count < randCVarsCount)
{
    var num = rnd.Next(1, 11);
    if (hCVars.Contains(num))
        Console.WriteLine("already in there");
    hCVars.Add(num);
}
lColVars = hsColVars.ToList();

由于 HashSet.ToList() 方法返回一个新的List,因此将HashSet转换为List应该保证List对象中值的唯一性。

显示这一点的ToList方法的源代码如下:

public static List<TSource> ToList<TSource> (this IEnumerable<TSource> source)
{
    Check.Source (source);
    return new List<TSource> (source);
}

在您的应用程序中,您只需要自己的临时变量来存储要检查的随机数。下面的示例程序显示了执行此操作的两种方法。

#define UNCONDITIONAL
using System;
using System.Collections.Generic;
using System.Linq;

namespace StackOverflow
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            HashSet<int> hash = new HashSet<int>();
            Random rnd = new Random();
#if(UNCONDITIONAL)
            Console.WriteLine("Adding unconditionally...");
#else
            Console.WriteLine("Adding after checks...");
#endif
            while(hash.Count < 5)
            {
                int rv = rnd.Next (1, 11);
#if(UNCONDITIONAL)
                hash.Add (rv);
#else
                if(hash.Contains(rv))
                {
                    Console.WriteLine ("Duplicate skipped");
                }
                else
                {
                    hash.Add (rv);
                }
#endif
            }
            List<int> list = hash.ToList ();  // ToList() gives back a new instance
            foreach(var e in list)
            {
                Console.WriteLine (e);
            }
        }
    }
}

注意:UNCONDITIONAL符号只是为了让您更轻松地使用示例。您可以将其注释掉以查看这两种行为。

定义符号的示例输出:

Adding unconditionally...
5
10
2
6
3

注释掉符号的示例输出:

Adding after checks...
Duplicate skipped
7
3
4
2
10