0

我有一个返回结果列表的查询。我想要该列表中的一个随机项目。

var query = (from...
            where...
            select q).Random(1); //Something like this?

这个怎么做?假设有 1 个项目我希望选择该项目。如果还有更多,那么我希望以随机顺序选择其中一个。

4

3 回答 3

4
var query = (from...
            where...
            orderby Guid.NewGuid()
            select q).First();
于 2012-07-24T16:40:17.003 回答
0

您可以将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;
}
于 2012-07-24T16:43:20.357 回答
0

这种随机播放方法比其他答案更好。链接时不会产生任何性能问题,而且它仍然是 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);
于 2018-08-04T20:04:40.357 回答