将对象随机添加到列表中而不重复

本文关键字:列表 对象 随机 添加 | 更新日期: 2024-09-21 05:37:08

我在这里遇到了一个小问题。我有一个问题列表KlausimuList,我必须形成另一个列表Atsitiktinis,它将是一个随机长度,并且将有来自KlausimuList的随机问题。我的方法有效,但问题是——问题是重复的。你能在他们没有的地方给我写一个代码吗?我有一个想法,为我已经添加的问题制作一个单独的int数组索引,然后每次检查该问题是否已经在该列表中。如果它真的生成了一个新的数字,但我不知道如何为这个东西写代码:D。谢谢你的建议。代码在c#中。

static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
    {
        Random kiek = new Random();
        int kiekis = kiek.Next(1, KlausimuList.Count);
        for (int i = 0; i < kiekis; i++)
            Atsitiktinis.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)]);
    }

将对象随机添加到列表中而不重复

您可以使用HashSet来避免重复。HashSet上的Add方法在尝试添加重复项时返回false

static void FormuotiAtsisiktini(List<Klausimas> KlausimuList, ref List<Klausimas> Atsitiktinis)
{
     Random kiek = new Random();
    int kiekis = kiek.Next(1, KlausimuList.Count);
    HashSet<Klausimas> hashset= new HashSet<Klausimas>();
    for (int i = 0; i < kiekis;)
    {
        i+=  hashset.Add(KlausimuList[kiek.Next(1, KlausimuList.Count)])?  1:0; // returns true when successfully added.
    }
    Atsitiktinis = hashset.ToList();            
}

这应该可以工作。它创建原始列表的副本,并从中删除已获取的项目:

static List<Klausimas> FormuotiAtsisiktini(List<Klausimas> KlausimuList)
{
  Random kiek = new Random();
  List<Klausimas> source = new List<Klausimas>(KlausimuList);
  List<Klausimas> result = new List<Klausimas>();
  int kiekis = kiek.Next(1, KlausimuList.Count);
  for (int i = 0; i < kiekis; i++)
  {
    var match = source[kiek.Next(0, source.Count - 1)];
    result.Add(match);
    source.Remove(match);
  }
  return result;
}

您所描述的称为无替换采样,本SO文章提供了解决方案。此外,为了确保您实际上是在向集合中添加重复项,请考虑使用HashSet而不是List