2009-10-14 17 views
50

Estoy usando C# y apuntando a .NET Framework 3.5. Estoy buscando una pieza de código pequeña, sucinta y eficiente para copiar todos los elementos en un ListBox a un List<String> (List genérico).La manera más sucinta de convertir ListBox.items a una lista genérica

En el momento en que tienen algo similar al código de abajo:

 List<String> myOtherList = new List<String>(); 
     // Populate our colCriteria with the selected columns. 

     foreach (String strCol in lbMyListBox.Items) 
     { 
      myOtherList.Add(strCol); 
     } 

que trabaja, por supuesto, pero no puedo evitar tener la sensación de que tiene que haber una mejor manera de hacer esto con algunas de las características más nuevas del lenguaje. Estaba pensando en algo así como el método List.ConvertAll, pero esto solo se aplica a las listas genéricas y no a las colecciones ListBox.ObjectCollection.

+0

¿Cuáles son los objetos en el cuadro de lista? – stevehipwell

+0

Lo sentimos, deberíamos haber declarado explícitamente que eran cadenas. – jamiei

+0

un método de extensión es lo que me gusta – nawfal

Respuesta

87

Un poco de LINQ debería hacerlo: -

var myOtherList = lbMyListBox.Items.Cast<String>().ToList(); 

por supuesto se puede modificar el parámetro Tipo del moldeada a cualquier tipo que haya almacenado en el Propiedad de los elementos

+0

Buena respuesta, gracias. – jamiei

+0

es 'List Mylist = new List (lbMyListBox.Items.Cast ()); ¿mejor o no hace la diferencia? La pregunta, supongo, es si, de esta manera, evitas la creación de otra lista o no. – ThunderGr

5

¿Qué tal esto:

List<string> myOtherList = (from l in lbMyListBox.Items.Cast<ListItem>() select l.Value).ToList(); 
2

¿Qué hay de:

myOtherList.AddRange(lbMyListBox.Items); 

EDITAR basado en los comentarios y la respuesta de DavidGouge:

myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value)); 
+0

dará el siguiente error: no se puede convertir de 'System.Windows.Forms.ListBox.ObjectCollection' a 'System.Collections.Generic.IEnumerable ' –

+0

ObjectCollection es IEnumerable pero no IEnumerable requerido por AddRange. – AnthonyWJones

+0

esto ni siquiera compila para mí – nawfal

26

El siguiente lo hará (usando LINQ):

List<string> list = lbMyListBox.Items.OfType<string>().ToList(); 

El OfType llamada se asegúrese de que solo se utilicen elementos en los elementos de la lista que sean cadenas.

Usando Cast, si alguno de los elementos no son cadenas, obtendrá una excepción.

+2

¡Eso es bueno saber! : D – DavidGouge

+1

Por supuesto, mediante el uso de OfType la lista resultante puede faltar elementos. Si se espera que el conjunto de elementos sea de un tipo específico, use Cast, ya que no oculta un error donde se han agregado los tipos incorrectos al ListBox (lo cual es fácil de hacer).Additionaly OfType omitirá los elementos que tienen un operador de Conversión al tipo de salida esperado, mientras que Cast invocará al operador del convertidor. – AnthonyWJones

+1

Sí. Realmente debería haber dicho "artículos que no se pueden moldear para cadenas". El problema OfType es un buen punto, pero si el ListBox solo debe contener cadenas, detendrá un bloqueo en el caso en que algo más se introduzca erróneamente en – adrianbanks

1

No necesita más. Obtiene Lista de todos los valores de Listbox

private static List<string> GetAllElements(ListBox chkList) 
     { 
      return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>(); 
     } 
Cuestiones relacionadas