J'utilise C # et je cible le .NET Framework 3.5. Je cherche un petit morceau de code succinct et efficace pour copier tous les éléments dans un ListBox vers un List<String>
(Générique Liste ).
Pour le moment, j'ai quelque chose de similaire au code ci-dessous:
List<String> myOtherList = new List<String>();
// Populate our colCriteria with the selected columns.
foreach (String strCol in lbMyListBox.Items)
{
myOtherList.Add(strCol);
}
Ce qui fonctionne, bien sûr, mais je ne peux pas m'empêcher d'avoir l'impression qu'il doit y avoir une meilleure façon de le faire avec certaines des nouvelles fonctionnalités du langage. Je pensais à quelque chose comme la méthode List.ConvertAll mais cela ne s'applique qu'aux listes génériques et non aux collections ListBox.ObjectCollection .
Un peu de LINQ devrait le faire: -
var myOtherList = lbMyListBox.Items.Cast<String>().ToList();
Bien sûr, vous pouvez modifier le paramètre Type de la distribution en n'importe quel type que vous avez stocké dans la propriété Items.
Ce qui suit le fera (en utilisant Linq):
List<string> list = lbMyListBox.Items.OfType<string>().ToList();
L'appel OfType garantit que seuls les éléments des éléments de la zone de liste qui sont des chaînes sont utilisés.
En utilisant Cast , si l'un des éléments n'est pas une chaîne, vous obtiendrez une exception.
Que dis-tu de ça:
List<string> myOtherList = (from l in lbMyListBox.Items.Cast<ListItem>() select l.Value).ToList();
Qu'en est-il de:
myOtherList.AddRange(lbMyListBox.Items);
EDIT basé sur les commentaires et la réponse de DavidGouge:
myOtherList.AddRange(lbMyListBox.Items.Select(item => ((ListItem)item).Value));
Vous n'en avez pas besoin de plus. Vous obtenez la liste de toutes les valeurs de Listbox
private static List<string> GetAllElements(ListBox chkList)
{
return chkList.Items.Cast<ListItem>().Select(x => x.Value).ToList<string>();
}