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

时间:2019-03-26 19:08:09

标签: c# list random

我正在尝试从列表中找到一个具有特定值的字段的项目;一些条目对该字段具有相同的值,在这种情况下,我想随机返回其中之一。如果有多个满足条件的条目,List.Find函数是否会随机返回一个?下面的代码是我目前拥有的;如果多次在同一列表中使用,如果多个满足条件,它将每次返回相同的条目吗?该列表足够大,以至于我不想遍历该列表,建立一个符合条件的所有列表,然后随机返回其中一个。我希望找到一种更有效的方法。如果这对于列表不可行,是否还有另一个更适合于此的数据结构?

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

public Category CatByName(string nm)
        {
            string name = nm.ToUpper();
            return Categories.Find(x => x.CategoryName.Contains(name));
        }

2 个答案:

答案 0 :(得分: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 :(得分:1)

由于Find仅适用于List<T>,因此您也可以使用Where,它适用于IEnumerable<T>

Random rnd = new Random();
var selected = Categories.Where(x => x.CategoryName.Contains(nm.ToUpper()));
var item = selected.Skip(rnd.Next(selected.Count()).FirstOrDefault();