2010-01-11 16 views
5

Bir temel sınıf aracılığıyla ilişkili olmayan farklı türden nesnelerin olacağı bir Listeden rasgele bir öğe elde etmeyi mümkün kılmanın en iyi yolunu arıyorum.Farklı <T> ile genel listelerden rastgele seçim yapın

List'e bir uzantı yöntemi oluştururken veya Listeyi alan bir yardımcı yöntem oluştururken loooking yapıyorum, ancak bir araya gelemedim. Her seferinde ne olduğunu bilmediğim bir T ile başa çıkmakta zorluk çekiyorum.

Bunu bir arabirim veya temel sınıf yapmadan yapmak mümkün müdür? Çünkü farklı T'ler için temel bir sınıf veya arayüz uygulamanın anlamlı bir yolunu göremiyorum. Selamlar Jesper Hauge


jenerik yöntemler hakkında biraz daha okumadan sonra bazı kod kendim yazmayı başardı. "Bir temel sınıf yoluyla ilgili olmayan nesneleri diye bir şey yoktur

private Picture SelectTopPic() 
{ 
    List<Picture> pictures = GetPictureList(); 
    return pictures.RandomItem(); 
} 
+3

Neden bir liste alır ve sadece n 0 arasında bir sayı ve listenin uzunluğu n-inci elemanı seçerek bir T döndüren bir işlev yapmak? –

+0

Muhtemelen benim sorunumun ne kadar açık olduğunu açıklamamıştım ama bana uygun bir çözüm buldum - kodumu yazıya ekledim. Yanıtladığınız/yorum yaptığınız için teşekkürler – Hauge

cevap

0

orijinal yayına eki olarak gösterilen bir uzatma yöntemi ile gidiş sona erdi:

aslında yukarıda o MSDN bağlantısındaki listeden rastgele bir eleman almak için bir örnek vardır.

.Hauge

3

:

public static class ListExt 
{ 
    public static T RandomItem<T>(this List<T> list) 
    { 
     if (list.Count == 0) 
      return default(T); 
     if (list.Count == 1) 
      return list[0]; 
     Random rnd = new Random(DateTime.Now.Millisecond); 
     return list[(rnd.Next(0, list.Count))]; 
    } 
} 

Aşağıdaki kod ile herhangi Listesi'nden rastgele öğeyi seçerek sağlayan bir uzantısı yöntemidir: Bu benim çözümdür ". Başka bir şey yoksa her zaman object s olacaktır. Yani bir List<object> istediğini yapacak.

+0

Bunun farkındaydım, ancak ihtiyacım olanı almadan önce bir veya daha fazla dönüşüm içermeyen bir yöntem arıyordum. – Hauge

+1

Onlar da aynı tipte ya da değiller. Statik olarak yazılmış bir dilde gerçek bir orta zemin yoktur. – Blindy

+0

Yine haklısın - ve yazdıkların bana yazmam için bana açık bir şekilde yeterince açıklamadığımı yazmam için sordu. Kullandığınız koda bakarsanız, muhtemelen daha nettir. Gördüğünüz gibi, bir liste 'dan rastgele bir öğeyi seçmeyi ve listenin içerdiği türden, nesne türü nesneler arasında geri ve ileri arasında dönüştürme yapmadan döndürmeyi sağlayan bir yöntem arıyordum. – Hauge

0

Bir Listeden rasgele bir öğe almak için, yalnızca onu kullanabilirsiniz. ElementAt yöntemi, alınacak öğenin rastgele oluşturulmuş bir dizinini geçirerek.

Random random = new Random(DateTime.Now.Millisecond); 
object randomItem = yourList.ElementAt(random.Next(0, yourList.Length)); 
+0

Liste 'da ElementAt yöntemi yok, ancak kodumdaki normal dizin sözdizimini kullandım. Bu yaklaşım zaten kullanıyordum, ama bunu çok kullanacaktım, bu yüzden kullanabileceğim bir yardımcı yöntem veya uzatma yöntemi arıyordum. Nasıl yaptığımı görmek için baştaki orijinal gönderiye bakın. – Hauge

İlgili konular