2016-04-08 16 views
1

Bu Post numaralı belgeyi bulduktan sonra List<T> ürünündeki öğeleri karıştırırken iyi bir çözümü vardır. Shuffle() kullanarak bir Listede bir Rastgele SINGLE RECORD almanın bir yolu var mı? - C#

Ama benim durumumda ben bu şekilde tanımlanan bir sınıf Person vardır:

List<Person> workers = new List<Person>() 
{ 
    new Person { Id = 1, Name = "Emp 1", Position = "Cashier"}, 
    new Person { Id = 2, Name = "Emp 2", Position = "Sales Clerk"}, 
    new Person { Id = 3, Name = "Emp 3", Position = "Cashier"}, 
    new Person { Id = 4, Name = "Emp 4", Position = "Sales Clerk"}, 
    new Person { Id = 5, Name = "Emp 5", Position = "Sales Clerk"}, 
    new Person { Id = 6, Name = "Emp 6", Position = "Cashier"}, 
    new Person { Id = 7, Name = "Emp 7", Position = "Sales Clerk"} 
}; 

Şimdi ben tüm kayıtları karıştırmak istiyorum: Bu benim uygulama ve kullanım

class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Position { get; set; } 
} 

olduğunu ve 1 Satış Memuru alın. İşte benim kodudur ve çalışıyor:

var worker = workers.OrderBy(x => Guid.NewGuid()).Where(x => x.Position == "Sales Clerk").First(); 

// This can yield 1 of this random result (Emp 2, Emp 4, Emp 5 and Emp 7). 
Console.WriteLine(worker.Name); 

Ama verilen Post GUID'ye göre kayıt rasgele olarak seçmek için iyi değil. Ve en kötüsü, Shuffle() kullanamaz ve istenen sonucu almak için Where ve First() uzantılarını çağırıyorum.

Bunu Shuffle() uzantısıyla nasıl yapabilirim?

cevap

3

soru, cevap karıştırılır listeye başvuru döndürmek için Karışık yöntemini değiştirmek için Linq operatörleri geri kalanı ile zincir Karıştır() 'dir böylece bunu elde etmek için nasıl ise:

public static IEnumerable<T> Shuffle<T>(this IList<T> list) 
{ 
    RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider(); 
    int n = list.Count; 
    while (n > 1) 
    { 
     byte[] box = new byte[1]; 
     do provider.GetBytes(box); 
     while (!(box[0] < n * (Byte.MaxValue/n))); 
     int k = (box[0] % n); 
     n--; 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 

    return list; 
} 

Kodunuz şuna dönüşür:

var worker = workers.Shuffle().Where(x => x.Position == "Sales Clerk").First(); 
+1

'var işçisi = workers.Shuffle() Flirts (x => x.Position == "Satış Clerk");' –

+0

Muhteşem.! Mükemmel cevap! –

+0

@JacobSeleznev de teşekkürler! –

1
Random oRandom = new Random(); 
var worker = workers[oRandom.Next(0,workers.Count)]; 
İlgili konular