0

結果のリストを返すクエリがあります。そのリストからランダムなアイテムを1つ欲しい。

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

これを行う方法?選択したいアイテムが1つあるとします。それ以上ある場合は、そのうちの1つをランダムな順序で選択する必要があります。

4

3 に答える 3

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

C#でリストをランダム化するにShuffle投稿された例をLINQメソッドと組み合わせて使用​​して、で拡張メソッドを作成できます。拡張内に移動しない限り、を呼び出す前に選択する必要があります。TakeIList<T>ToListRandom

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 に答える