C# 如何从列表中选择随机元素排除某些列表?

C# 如何从列表中选择随机元素排除某些列表?,c#,list,linq,C#,List,Linq,所以我有了CardBase抽象类和 我想提取一些随机的卡片元素,排除一些特定的卡片列表。 所以我喜欢这个 public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) { var returnCards = from card in list

所以我有了CardBase抽象类和 我想提取一些随机的卡片元素,排除一些特定的卡片列表。 所以我喜欢这个

public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList)
{        
    var returnCards = from card in list
                               where !excludeList.Contains(card)
                               select card;
    foreach (CardBase cd in returnCards.Take(elementsCount))
    {
        Debug.Log("Selected random card is "+cd.name);
    }
    return (List<CardBase>) returnCards.Take(elementsCount);
}
public List getrandeclude(List-List,int-elementscont,List-excludeList)
{        
var returnCards=来自列表中的卡片
其中!excludeList.Contains(卡片)
选择卡片;
foreach(返回卡中的CardBase cd.Take(elementsCount))
{
Debug.Log(“所选随机卡为”+cd.name);
}
返回(列表)返回卡。获取(元素搜索);
}
我做得对吗? 有更好的办法吗? 提前谢谢


所以我做了一点这样的改变。这似乎有效

public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList)
{        
    var returnCards = from card in list
                               where !excludeList.Contains(card)
                               select card;
    foreach (CardBase cd in returnCards.OrderBy(arg => Guid.NewGuid()).Take(elementsCount).ToList())
    {
        Debug.Log("Selected random card is "+cd.name);
    }
    return returnCards.OrderBy(arg => Guid.NewGuid()).Take(elementsCount).ToList();
}
public List getrandeclude(List-List,int-elementscont,List-excludeList)
{        
var returnCards=来自列表中的卡片
其中!excludeList.Contains(卡片)
选择卡片;
foreach(returnCards.OrderBy(arg=>Guid.NewGuid()).Take(elementscont.ToList())
{
Debug.Log(“所选随机卡为”+cd.name);
}
return returnCards.OrderBy(arg=>Guid.NewGuid()).Take(elementscont.ToList();
}

您可以按照Linq路线使用
,除非
CardBase
具有某种形式的相等比较。另外,您可以使用重载并提供一个
IEqualityComparer比较器

从那里你想随机选择卡从可用的卡剩余

static Random randomizer = new Random();
public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList) {
    var availableCards = list.Except(excludeList).ToList();
    int count = Math.Min(elementsCount, availableCards.Count);
    var selectedCards = new HashSet<CardBase>();
    do{
        var index = randomizer.Next(0, availableCards.Count);
        var card = availableCards[index];
        selectedCards.Add(card);
    } while (selectedCards.Count < count);
    foreach (CardBase cd in selectedCards) {
        Debug.Log("Selected random card is " + cd.name);
    }
    return selectedCards.ToList();
}
static Random randomizer=new Random();
public List getrandeclude(List List,int elementscont,List excludeList){
var availableCards=list.Except(excludeList.ToList();
int count=Math.Min(elementscont,availableCards.count);
var selectedCards=newhashset();
做{
var index=randomizer.Next(0,availableCards.Count);
var卡=可用卡[索引];
选择卡片。添加(卡片);
}while(selectedCards.Count
您的代码将出现铸造异常

因此,首先获取cardBase的
IEnumerable

然后使用
ToList()

public List getrandeclude(List-List,int-elementscont,List-excludeList)
{
var returnCards=来自列表中的卡片
其中!excludeList.Contains(卡片)
选择卡片;
foreach(返回卡中的CardBase cd.Take(elementsCount))
{
//Debug.Log(“所选随机卡为”+cd.name);
}
IEnumerable newList=returnCards.Take(elementscont);
返回newList.ToList();
}

我可以想象,您当前的方法会出现一些异常和/或不想要的结果。因此,请添加一些小示例列表,以显示所需结果的所有方面。我认为如果您想随机进行,您可能想考虑使用一个随机数来告诉您应该从剩余的列表项中取出多少个数字,并使用同一个类来生成每个数字的索引,以便从列表中选择。谢谢,因此,除了最简单的关键字之外,还有最简单的关键字。我现在正在使用Unity游戏引擎,所以Unity提供了Random.Range函数。那么也许我不需要使用system.random()?我不熟悉Unity,所以我不能说。您的问题中没有迹象表明这与unityLooks有关,因为它允许重复选择同一张卡。。。我忽略了什么吗?
 public List<CardBase> GetRandExclude(List<CardBase> list, int elementsCount, List<CardBase> excludeList)
        {
            var returnCards = from card in list
                              where !excludeList.Contains(card)
                              select card;
            foreach (CardBase cd in returnCards.Take(elementsCount))
            {
                //Debug.Log("Selected random card is " + cd.name);
            }
            IEnumerable<CardBase> newList = returnCards.Take(elementsCount);
            return newList.ToList();
        }