2009-08-15 17 views
5

Próbuję utworzyć metodę rozszerzenia, która przetasuje zawartość ogólnej kolekcji list, niezależnie od jej typu, ale nie jestem pewien, co umieścić między < .. > jako parametr. czy umieszczam obiekt? lub Typ? Chciałbym móc użyć tego w dowolnej kolekcji List, którą mam.Jak określić parametr dla ogólnej metody rozszerzania listy C#

Dzięki!

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); 
    } 
} 

Odpowiedz

11

Musisz zrobić to metoda rodzajowa:

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); 
    } 
} 

które pozwolą go do pracy z dowolnym List<T>.

+4

Muszę nauczyć się pisać szybciej. W każdym razie "IList " byłby bardziej ogólny. –

+0

kiedy wypróbuję wszystkie wymienione metody, otrzymam ... Argument "2": nie można przekonwertować z "obiektu" na "T" – Grant

+2

@Grant: Musisz zmienić fragment w środku, aby użyć "T" zamiast "obiektu" "(lub dodaj obsadę). Jak wspomniał John, użycie IList byłoby bardziej ogólne, chociaż nie wszystkie implementacje IList , więc może nie działać ogólnie. –

4

po prostu zrobić własny sposób ogólna:

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

Nieco off-topic, ale Fisher-Yates shuffle będzie mniej uprzedzeń i lepszą wydajność niż metoda:

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

Myślę, że to rozwiązanie szybsze do przetworzenia, ponieważ otrzymasz losy losowo, a twoja pozycja zostanie zachowana do przyszłego użytku.

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; 
     } 
    } 
} 

Kroki:

  1. Stwórz swoją klasę Static zidentyfikować rozszerzenia
  2. Załóż wy metodę rozszerzenia (musi być statyczny)
  3. przetworzyć dane.
Powiązane problemy