【问题标题】:Select single random item from list of items [duplicate]从项目列表中选择单个随机项目[重复]
【发布时间】:2012-07-24 16:38:11
【问题描述】:
我有一个返回结果列表的查询。我想要该列表中的一个随机项目。
var query = (from...
where...
select q).Random(1); //Something like this?
如何做到这一点?假设有 1 个项目我希望选择该项目。如果还有更多,那么我希望以随机顺序选择其中一个。
【问题讨论】:
标签:
linq
linq-to-sql
random
【解决方案1】:
var query = (from...
where...
orderby Guid.NewGuid()
select q).First();
【解决方案2】:
您可以将Randomize a List in C# 中发布的Shuffle 示例与LINQ Take 方法结合使用在IList<T> 上创建扩展方法,您需要在调用@ 之前ToList 您的选择987654327@,除非您将其移到扩展程序中。
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;
}
【解决方案3】:
这种随机播放方法比其他答案更好。链接时不会产生任何性能问题,而且它仍然是 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);