2010-01-11 18 views
5

Estoy buscando la mejor manera de hacer posible obtener un elemento aleatorio de una lista donde las T serán objetos de diferentes tipos que no están relacionados a través de una clase base.Seleccionar al azar de listas genéricas con <T>

He estado buscando crear un método de extensión para List, o un método de ayuda que recibe una lista, pero no he podido juntarlo. Cada vez que me he encontrado con problemas para manejar una T, no sé qué es.

¿Es posible hacer esto sin hacer una interfaz o una clase base? Porque no veo ninguna forma significativa de implementar una clase base o interfaz para las diferentes "T".

Saludos Jesper Hauge


Después de leer un poco más acerca de los métodos genéricos que logró escribir algo de código a mí mismo. Esta es mi solución:

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

Se trata de un método de extensión que permite la selección de un artículo al azar de cualquier lista con el siguiente código:

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

Por qué no hacer una función que obtiene una lista y devuelve una T con tan solo seleccionar el elemento enésimo donde n es un número entre 0 y la longitud de la lista? –

+0

Probablemente no le expliqué claramente cuál era mi problema, pero encontré una solución que me convenía: agregué mi código a la publicación. Gracias por responder/comentar – Hauge

Respuesta

0

terminó yendo con un método de extensión, que se muestra como un apéndice de la publicación original.

.Hauge

3

No hay tal cosa como "no objetos relacionados a través de una clase base ". Si nada más, siempre tendrás object s. Entonces, un List<object> hará lo que quiera.

+0

Estaba al tanto de eso, pero estaba buscando un método que no implicara una o más conversiones antes de obtener lo que necesitaba. – Hauge

+1

Bueno, o son del mismo tipo o no lo son. No existe un punto medio real en un lenguaje de tipo estático. – Blindy

+0

Tiene razón otra vez, y sus comentarios fueron lo que me impulsó a escribir que probablemente no me expliqué con la suficiente claridad. Si miras el código que terminé usando, probablemente sea mucho más claro. Como puede ver, estaba buscando un método que permita seleccionar un elemento aleatorio de una lista y devolverlo como el tipo que contenga la lista, sin convertir un objeto y otro entre objetos. – Hauge

0

Para obtener un elemento aleatorio de una lista, puede usar simplemente. ElementAt método, pasando un índice generado aleatoriamente del elemento para recuperar.

En realidad, hay un ejemplo de cómo recuperar un elemento aleatorio de la lista, en la que enlazan MSDN anterior:

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

No hay método ElementAt en la lista , pero usé la sintaxis de índice común en mi código. Este enfoque era el que ya estaba usando, pero iba a usarlo mucho, así que estaba buscando un método de ayuda o un método de extensión que pudiera usar. Vea la publicación original en la parte superior para ver cómo lo hice. – Hauge

Cuestiones relacionadas