2009-08-15 2 views
5

Я пытаюсь создать метод расширения, который будет перемешать содержимое общей коллекции списков, независимо от его типа, но не уверен, что положить между < .. > как параметр. я помещаю объект? или Тип? Я хотел бы иметь возможность использовать это в любой коллекции List, которую у меня есть.Как указать параметр для метода расширения общего типа списка в C#

Спасибо!

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

ответ

11

Вы должны сделать это универсальный метод:

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

Это позволит ему работать с любым List<T>.

+4

Мне нужно научиться печатать быстрее. Во всяком случае, 'IList ' будет более общим. –

+0

, когда я пытаюсь использовать все перечисленные методы, я получаю ... Аргумент '2': не может преобразовать из 'объекта' в 'Т' – Grant

+2

@Grant: вам нужно изменить часть в середине, чтобы использовать «Т» вместо «объекта "(или добавить бросок). Как упоминал Джон, использование IList было бы более общим, хотя не все IList внедрить вставку, поэтому она может вообще не работать. –

4

Вы просто сделать свой собственный метод родовое:

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

Немного не по теме, но Fisher-Yates shuffle будет меньше предвзятости и лучшую производительность, чем ваш метод:

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

Я думаю, что это решение быстрее чтобы обрабатывать, потому что вы получите ваши иены случайным образом, и ваша позиция коллекции будет сохранена для будущего использования.

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

Шаги:

  1. Создать свой статический класс для определения расширений
  2. Создать вас метод расширения (должен быть статическим)
  3. обрабатывать ваши данные.
Смежные вопросы