【问题标题】:Only add random number to list in loop when doesn't already exist仅在不存在时将随机数添加到循环列表中
【发布时间】:2015-10-27 22:59:33
【问题描述】:

刚开始使用列表。出于自动化测试的目的,我正在生成一个不同值的列表。以下是关注的代码块:

Random rnd = new Random();
List<int> lVars = new List<int>();

        while (VarsCount < randVarsCount)
        {
            if(VarsCount > 0)
            {
                while(lVars.Distinct().Count() != lVars.Count()) 
                {
                    lRowVars.Insert(VarsCount, rnd.Next(1, 11)); //problem code 
                }
            }
            lVars.Add(rnd.Next(1, 11));
            MessageBox.Show(lRowVars[aRowVarsCounter].ToString());
            aRowVarsCounter++;
        }

基本上,我如何检查添加的 int 是否与所有列表匹配(因为我的代码不起作用)....我尝试了一些其他代码,但最终是很多额外的代码和循环;通常当我觉得我在做一些多余的事情时,我会发现有一个更简单的方法。

【问题讨论】:

  • 如果值集已知且固定;创建一个数组(或其他)并打乱它;如果不使用 HashSet (或类似的)来确保它只包含每个项目一次(如果它已经存在或不存在,则它的 Add 方法返回)
  • 你到底想做什么? “问题代码”的问题是什么?如果你想添加超过 10 个值,你可能会遇到麻烦。
  • 你的内部 while 循环是错误的。您添加重复项,然后测试是否存在重复项并停止。在插入新项目之前,您需要测试该值是否存在
  • @jdweng 我知道...这正是我想要的...尝试查看项目是否存在而不必做一堆其他循环...这可能吗?
  • 正常的方法是制作一个二维列表 2 x 11。第 1 列添加数字 1 到 11。第 2 列添加随机数。然后按随机数排序。这样你就不会得到重复。

标签: c# list loops random


【解决方案1】:

在考虑“具有不同值的列表”时,如果您不关心排序(这里似乎就是这种情况),请考虑“设置”。一个集合最多只包含一个给定的值。你可以做类似的事情

int maxRnd = 11;
int desiredCount = 4;
if (desiredCount > maxRnd) throw new Exception("Impossible.");

HashSet<int> unique = new HashSet<int>();
while (unique.Count < desiredCount)
{
    unique.Add(rnd.Next(1, maxRnd));
}

// If needed, convert to a list

var uniqueList = unique.ToList();

【讨论】:

  • 注意是否 desiredCount 大于 10 :-)
  • @JeffOrris:如果数字是随机生成的,那么顺序有什么影响?随机数没有固有的顺序。
  • @JeffRSon:是的,在写作时考虑到了这一点 :-) 添加了明确的检查。
  • @EricJ。我的错......误解了你在说什么......列表的实际顺序在我的结果中很重要,但在支票上并不重要;感谢您的宝贵时间。
猜你喜欢
  • 2011-10-30
  • 2019-08-08
  • 2012-05-23
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
相关资源
最近更新 更多