Je veux trouver une meilleure façon de remplir une liste générique à partir d'une liste à valeur ajoutée en C #.
Je peux faire les suivants assez facilement:
List<string> selectedFields = new List<string>();
foreach (object a in chkDFMFieldList.CheckedItems) {
selectedFields.Add(a.ToString());
}
Il doit y avoir une méthode plus élagante pour lancer la collection CheckeDitems à ma liste.
essayez ceci (à l'aide de system.linq) :
OfType()
est une méthode d'extension, vous devez donc utiliser System.Linq
List<string> selectedFields = new List<string>();
selectedFields.AddRange(chkDFMFieldList.CheckedItems.OfType<string>());
Ou juste le faire en une seule ligne:
List<string> selectedFields = chkDFMFieldList.CheckedItems.OfType<string>().ToList();
Ce n'est pas exactement la réponse à votre exigence, mais en affectant une réponse plus générale. Vous pouvez le faire de différentes manières:
1)
T[] items = new T[lb.Items.Count];
lb.Items.CopyTo(items, 0);
var lst = new List<T>(items);
2) boucler et ajouter en utilisant foreach
comme vous l'avez mentionné.
3) en utilisant linq
var lst = lb.Items.Cast<T>().ToList();
4) ou
var lst = lb.Items.OfType<T>().ToList();
Lorsque j'ai fait des tests de performance comme ci-dessous, j'ai trouvé la copie à la méthode de la matrice le plus rapide pendant que les méthodes LINQ sont plus lentes. Bien sûr, dans des scénarios du monde réel, ceux-ci ne compteraient pas. Je préfère la 3ème méthode (LINQ) pour la lisibilité.
DateTime d = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
Action();
}
MessageBox.Show((DateTime.Now - d).TotalMilliseconds.ToString());
Pour une itération de 10000 fois exécutée plusieurs fois avec environ 300 éléments dans la zone de liste,
1) ~ 100ms
2) ~ 150ms
3) ~ 250ms
4) ~ 260ms