2009-01-23 17 views
29

Quiero encontrar una manera mejor de rellenar una lista genérica de un cuadro de lista de control en C#.Lanzar una colección de elementos de un cuadro de lista a una lista genérica

que puede hacer lo siguiente con bastante facilidad:

List<string> selectedFields = new List<string>(); 

foreach (object a in chkDFMFieldList.CheckedItems) { 
     selectedFields.Add(a.ToString()); 
     } 

Debe haber un método más Elagent para emitir la colección CheckedItems a mi lista.

Respuesta

44

Prueba esto (usando System.Linq):

OfType() es un método de extensión, por lo que es necesario utilizar System.Linq

List<string> selectedFields = new List<string>(); 
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>()); 

O sólo lo hacen en una sola línea:

List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList(); 
+0

¿Hay alguna manera de conocer el tipo de ItemCollection? Entonces el método funciona con cualquier colección de artículos sin saber el tipo – Omar

+0

"Tipo ()" - ¡Hoy aprendí algo nuevo! Gracias Matt! –

1

Si no tiene acceso a LINQ, entonces no hay una manera más elegante ya que está realizando una segunda operación en th e enumere elementos (llamando al ToString()) además de completar la colección selectedFields.

11

Esta no es exactamente la respuesta a su requerimiento, pero publicando una respuesta más general. Usted puede hacerlo en una variedad de maneras:

1)

T[] items = new T[lb.Items.Count]; 
lb.Items.CopyTo(items, 0); 
var lst = new List<T>(items); 

2) y la adición de bucle utilizando foreach como usted ha mencionado.

3) usando Linq

var lst = lb.Items.Cast<T>().ToList(); 

4) o

var lst = lb.Items.OfType<T>().ToList(); 

Cuando hice algunas pruebas de rendimiento, como a continuación, encontré copia al método de matriz el más rápido mientras que los métodos Linq más lento. Por supuesto, en escenarios del mundo real, estos no importarían. Prefiero el 3er método (Linq) para la legibilidad.

DateTime d = DateTime.Now; 
for (int i = 0; i < 10000; i++) 
{ 
    Action(); 
} 
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString()); 

Para una iteración de 10000 veces ejecutar varias veces con alrededor de 300 artículos en cuadro de lista,

1) ~ 100 ms

2) ~ 150ms

3) ~ 250 ms

4) ~ 260ms

+1

Excavando en el vasto archivo de StackOverflow ... @nawfal, la ventaja de la solución ** 4) ** es que si tiene diferentes elementos en su colección (por ejemplo, menú con 'MenuItem's y' Separator's) 'OfType 'simplemente elegirá los elementos' 'de la colección, mientras que ** 3) ** lanzará' InvalidCastException'. – Mike

Cuestiones relacionadas