我有一个返回结果列表的查询。我想要该列表中的一个随机项目。
var query = (from...
where...
select q).Random(1); //Something like this?
这个怎么做?假设有 1 个项目我希望选择该项目。如果还有更多,那么我希望以随机顺序选择其中一个。
我有一个返回结果列表的查询。我想要该列表中的一个随机项目。
var query = (from...
where...
select q).Random(1); //Something like this?
这个怎么做?假设有 1 个项目我希望选择该项目。如果还有更多,那么我希望以随机顺序选择其中一个。
var query = (from...
where...
orderby Guid.NewGuid()
select q).First();
您可以将Shuffle
发布在C# 中的随机列表中的示例与 LINQTake
方法结合使用在 上创建扩展方法IList<T>
,您需要ToList
在调用之前进行选择Random
,除非您将其移动到扩展中。
public static List<T> Random<T>(this IList<T> list, int takeNumber)
{
return list.Shuffle().Take(takeNumber);
}
public static List<T> Shuffle<T>(this IList<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1) {
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
return list;
}
这种随机播放方法比其他答案更好。链接时不会产生任何性能问题,而且它仍然是 LINQ。
public static IEnumerable<T> TakeRandom<T>(this IEnumerable<T> source, int count)
{
return source.Shuffle().Take(count);
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
{
return source.OrderBy(x => Guid.NewGuid());
}
用法:
var query = (from...
where...
select q).TakeRandom(1);