web-dev-qa-db-fra.com

Casting d'une collection d'articles à partir d'une liste de liste à une liste générique

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.

38
Alex

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();
58
Matt Hamilton

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

13
nawfal