2009-08-15 18 views
5

Türüne bakılmaksızın genel liste koleksiyonunun içeriğini karıştıracak bir uzantı yöntemi oluşturmaya çalışıyorum ancak < arasında ne konacağından emin değilim. > parametre olarak. nesne koyarım veya yazın? Bunu sahip olduğum herhangi bir Liste koleksiyonunda kullanmak istiyorum.Genel liste türü uzantısı yöntemi için parametre belirtme C#

Teşekkürler!

public static void Shuffle<T>(this List<T> source) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < source.Count; i++) 
    { 
     int index = rnd.Next(0, source.Count); 
     T o = source[0]; 

     source.RemoveAt(0); 
     source.Insert(index, o); 
    } 
} 

herhangi List<T> ile çalışmak için izin verir:

public static void Shuffle(this List<???????> source) 
{ 
    Random rnd = new Random(); 

    for (int i = 0; i < source.Count; i++) 
    { 
     int index = rnd.Next(0, source.Count); 
     object o = source[0]; 

     source.RemoveAt(0); 
     source.Insert(index, o); 
    } 
} 

cevap

11

Ona bir jenerik yöntem yapmak gerekir.

+4

Daha hızlı yazmayı öğrenmem gerekiyor. Neyse, "IList " daha genel olurdu. –

+0

listelenen tüm yöntemleri denediğimde ... Argüman '2': 'object' dan 'T' ye dönüşemiyor – Grant

+2

@Grant: Ortadaki kısmı "object" yerine "T" kullanmak için değiştirmeniz gerekiyor "(ya da bir döküm ekleyin). John'un da belirttiği gibi, IList 'u kullanmak, genel olarak IList uygulama eki olmasa da daha genel olurdu, bu yüzden genellikle işe yaramayabilir. –

4

Sadece kendi yöntem genel olun:

public static void Shuffle<T>(this List<T> source) 
3

Biraz konu dışı ama Fisher-Yates shuffle sizin yönteme göre daha az önyargı ve daha iyi performansa sahip olacak: Ben daha hızlı Bu çözümü düşünün

public static void ShuffleInPlace<T>(this IList<T> source) 
{ 
    if (source == null) throw new ArgumentNullException("source"); 

    var rng = new Random(); 

    for (int i = 0; i < source.Count - 1; i++) 
    { 
     int j = rng.Next(i, source.Count); 

     T temp = source[j]; 
     source[j] = source[i]; 
     source[i] = temp; 
    } 
} 
0

işlemek için, itensinizi rastgele alacaksınız ve koleksiyon konumunuz gelecekteki kullanım için korunacaktır.

namespace MyNamespace 
{ 
    public static class MyExtensions 
    { 
     public static T GetRandom<T>(this List<T> source) 
     { 
      Random rnd = new Random(); 
      int index = rnd.Next(0, source.Count); 
      T o = source[index]; 
      return o; 
     } 
    } 
} 

Adımlar:

  1. Uzantılarınızı
  2. oluşturun Uzatma Yöntemi (statik olmalıdır)
  3. Süreç veri tanımlama için statik sınıfı oluşturun.