我正在尝试从列表中找到具有特定值的字段的项目;某些条目对于此字段具有相同的值,在这种情况下,我想随机返回其中一个。如果有多个条目满足条件,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));
}
简答:不,你必须迭代列表。
答案很长:选择某个项目的概率取决于符合条件的项目数量。因此,您必须扫描整个列表。
我建议做的是将所有匹配的项目放入列表中,然后采用随机索引。我发现比通过随机数排序更具可读性和更少混淆。
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)];
}
由于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();