我正在尝试从列表中找到一个具有特定值的字段的项目;一些条目对该字段具有相同的值,在这种情况下,我想随机返回其中之一。如果有多个满足条件的条目,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));
}
答案 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();