私はC# 3.5
を使用しており、現在Linq
を使用して、ユーザーテーブルからすべてのユーザーを取得し、それらをリストに入れています。
次に、そのリストからランダムなユーザーを返したいと思います。それを行う最善の方法は何ですか?
このような:
var Rand = new Random();
var user = users[Rand.Next(users.Count)];
ElementAt
を使用します。
var Rand = new Random();
var user = users.ElementAt( Rand.Next( users.Count() ) );
汎用のヘルパーや拡張機能を作成してみませんか?!
namespace My.Core.Extensions
{
public static class EnumerableHelper<E>
{
private static Random r;
static EnumerableHelper()
{
r = new Random();
}
public static T Random<T>(IEnumerable<T> input)
{
return input.ElementAt(r.Next(input.Count()));
}
}
public static class EnumerableExtensions
{
public static T Random<T>(this IEnumerable<T> input)
{
return EnumerableHelper<T>.Random(input);
}
}
}
使用法は次のとおりです。
var list = new List<int>() { 1, 2, 3, 4, 5 };
var output = list.Random();
entity FrameworkまたはLinq 2 Sqlの場合、この拡張メソッドを使用できます
public static T RandomElement<T>(this IQueryable<T> q, Expression<Func<T,bool>> e)
{
var r = new Random();
q = q.Where(e);
return q.Skip(r.Next(q.Count())).FirstOrDefault();
}
// persons.RandomElement(p=>p.Age > 18) return a random person who +18 years old
// persons.RandomElement(p=>true) return random person, you can write an overloaded version with no expression parameter
このようなものはどうですか?
var users = GetUsers();
var count = user.Count();
var Rand = new System.Random();
var randomUser = users.Skip(Rand.Next(count)).FirstOrDefault();
Random
クラスを使用して、擬似乱数を生成できます。これを使用して、配列またはリストに有効なインデックスの範囲内で乱数を生成します。
Random Rand = new Random();
var user = Users[Rand.Next(Users.Count)];
他の例をご覧になりたい場合は、ランダム指向のLINQ拡張機能をいくつか作成し、記事 ランダム操作によるLINQの拡張 で公開しました。