2013-10-16 15 views
10

Ben x miktar kullanıcıları ile bir veritabanım var ve ben tüm kullanıcıları rastgele almak istiyorum ve daha sonra sitemde 50 kullanıcı gibi yazmak istiyorum. Şu anda sadece .take(50) kullanıyorum ve en son 50 kullanıcıyı buldum. Bütün tablodan rastgele 50 karıştırmak istiyorum, Herhangi bir fikir?Linq veya lambda kullanarak X rasgele öğeleri tablodan alın C#

Bu benim kod artık neye benzediği:

userList = userList.OrderBy(user => -user.ID).Take(userCount).ToList(); 

NOT:userlist tüm kullanıcıların benim listesidir. Gördüğünüz gibi, şu anda kaç kullanıcı tarafından listeleneceğini söylediğim, userCount adlı bir değişkeni olan lambda'yı kullanıyorum!

+0

Ben tabii bu rastgele kullanımı çeşit istemek olabilir. Ama bilmiyorum nasıl :( – user2862542

cevap

23

deneyin bu

Random rnd = new Random(); 
userList = userList.OrderBy(user => rnd.Next()).Take(usercount).ToList(); 
+0

Hehe teşekkür ederim! İşe yarıyor :) Kinda kolay lol, Kendi başıma bulmalı mıyım? :) – user2862542

+0

"En doğru" 5 dakika tho beklemek zorunda gibi ur gönderen bayrak olacak :) @MikeSW – user2862542

+0

'' by by cümlesi '' rnd' nesnesinin döndürdüğü sayı bir kullanıcı id olduğunu varsayalım mı? Demek istediğim, mevcut olmayan bir kimlik almak mümkün mü? –

0

sisteminizde

1.

List<int> ids = new List<int>(50); 
int total = userList.Count(); 
Random r = new Random(); 
while (ids.Count() < 50) 
{ 
    var next = r.Next(total); 
    if (!ids.Contains(next)) 
     ids.Add(next); 
} 
var users = userList.Where(a => ids.Contains(a.ID)); 

2.

MikeSW yendi kaç kullanıcıları bağlı Bunu yapmanın 2 yolu vardır bana bu bir

Seçenekler arasındaki fark, 1) veritabanına 2 sorgu sorgusu içermesi ve 2) veritabanının tüm kullanıcılarının sadece 50'sini yüklemek için yüklenmesidir. Bunu yapmanın daha iyi bir yolu olan size kalmış. tüm kullanıcıların yüklemek ve daha sonra bunlardan 50 almak tamam olduğunda

0

, böyle bir while döngüsü kullanabilirsiniz: varsayarsak

List<object> randomUsers = new List<User>(); 
Random r = new Random(); 
while (randomUsers.Count < 50) 
{ 
    userList 
     // skip previously selected users 
     .Except(randomUsers) 
     // random number to skip a random amount of users 
     .Skip(r.Next(0, userList.Count() - 1 - randomUsers.Count)) 
     // and then take the next one 
     .First(); 
} 
0

ben tavsiye ederim senin varlığın bir kimliği birincil anahtar sütunu var Aşağıdaki sorguları kullanın ya da bir sebepten ötürü çok fazla veri getireceksiniz.

var rnd = new Random(); 

// Get the employeeIds. 
var employeeIds = EmployeeService.Data() 
    .Select(e => e.Id) 
    .ToList(); 

// Choose n number of random employeeIds. 
var randomEmployeeIds = employeeIds 
    .OrderBy(id => rnd.Next()) 
    .Take(x); 

// Get random employees. 
var employees = EmployeeService.Data().Where(emp => randomEmployeeIds.Contains(emp.Id)); 
0

Random

public static class MyExtensions 
{ 
    public static IEnumerable<T> GetRandomItems<T>(this IEnumerable<T> source, Int32 count) 
    { 
     return source.OrderBy(s => Guid.NewGuid()).Take(count); 
    } 
} 

olmadan Uzantı Ve şimdi

userList = userList.GetRandomItems().ToList();