如何从具有特定值的C#列表中查找随机项?

问题描述 投票:1回答:2

我正在尝试从列表中找到具有特定值的字段的项目;某些条目对于此字段具有相同的值,在这种情况下,我想随机返回其中一个。如果有多个条目满足条件,List.Find函数是否会随机返回一个?下面的代码就是我现在拥有的代码;如果多次在同一列表中使用,如果多个符合条件,它是否会每次都返回相同的条目?列表足够大,我宁愿不通过,建立符合标准的所有内容的列表,然后随机返回其中一个;我希望找到一种更有效的方式。如果这对List不可行,那么还有另一种更适合这种情况的数据结构吗?

public List<Category> Categories {get; set;}

public Category CatByName(string nm)
        {
            string name = nm.ToUpper();
            return Categories.Find(x => x.CategoryName.Contains(name));
        }
c# list random
2个回答
3
投票

简答:不,你必须迭代列表。

答案很长:选择某个项目的概率取决于符合条件的项目数量。因此,您必须扫描整个列表。

我建议做的是将所有匹配的项目放入列表中,然后采用随机索引。我发现比通过随机数排序更具可读性和更少混淆。

public Category CatByName(string nm)
{
    string name = nm.ToUpper();
    var matching = Categories.Where(x => x.CategoryName.Contains(name)).ToList();
    if (matching.Count == 0)
    {
       return null;
    }
    Random rnd = new Random();
    return matching[rnd.Next(matching.Count)];
}

1
投票

由于Find只适用于List<T>,你也可以使用适用于WhereIEnumerable<T>

Random rnd = new Random();
var selected = Categories.Where(x => x.CategoryName.Contains(nm.ToUpper()));
var item = selected.Skip(rnd.Next(selected.Count()).FirstOrDefault();
© www.soinside.com 2019 - 2024. All rights reserved.