結果のリストを返すクエリがあります。そのリストからランダムなアイテムを1つ欲しい。
var query = (from...
where...
select q).Random(1); //Something like this?
これを行う方法?選択したいアイテムが1つあるとします。それ以上ある場合は、そのうちの1つをランダムな順序で選択する必要があります。
結果のリストを返すクエリがあります。そのリストからランダムなアイテムを1つ欲しい。
var query = (from...
where...
select q).Random(1); //Something like this?
これを行う方法?選択したいアイテムが1つあるとします。それ以上ある場合は、そのうちの1つをランダムな順序で選択する必要があります。
var query = (from...
where...
orderby Guid.NewGuid()
select q).First();
C#でリストをランダム化するにShuffle
投稿された例をLINQメソッドと組み合わせて使用して、で拡張メソッドを作成できます。拡張内に移動しない限り、を呼び出す前に選択する必要があります。Take
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);