2009-08-15 14 views
5

Estoy tratando de hacer un método de extensión que mezcle los contenidos de una colección de listas genéricas independientemente de su tipo, pero no estoy seguro de qué poner entre < .. > como el parámetro. ¿Pongo un objeto? o Tipo? Me gustaría poder usar esto en cualquier colección de Lista que tenga.Cómo especificar el parámetro para el método de extensión de tipo de lista genérico en C#

Gracias!

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

Respuesta

11

Usted necesita para que sea un método genérico:

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

que permitirá que funcione con cualquier List<T>.

+4

Tengo que aprender a escribir más rápido. De todos modos, 'IList ' sería más general. –

+0

cuando pruebo todos los métodos listados, me sale ... Argumento '2': no ​​se puede convertir de 'objeto' a 'T' – Grant

+2

@Grant: Necesita cambiar la parte en el medio para usar "T" en lugar de "objeto "(o agrega un molde). Como mencionó John, usar IList sería más general, aunque no todos los IList implementan la inserción, por lo que es posible que no funcione en general. –

4

Usted acaba de hacer su propio método genérico:

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

poco fuera de tema, pero una Fisher-Yates shuffle tendrá menos sesgo y un mejor rendimiento que el método:

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

Creo que esta solución más rápida para procesar, porque obtendrá su itens al azar y su posición de colección se conservará para su uso futuro.

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

Pasos:

  1. crear su clase estática para identificar sus extensiones
  2. crearle método de extensión (debe ser estático)
  3. procesar sus datos.
Cuestiones relacionadas