c # façon plus élégante gamme Assigner à une liste?
-
27-10-2019 - |
Question
J'ai ceci:
// Load changelog types
ChangeLogType[] Types = ChangeLogFunctions.GetAllChangelogTypes();
foreach(ChangeLogType Rec in Types){
ListItem N = new ListItem();
N.Text = Rec.Type;
N.Value = Rec.ID.ToString();
LstChangeLogType.Items.Add(N);
}
Il appelle une fonction qui renvoie un tableau de ChangeLogTypes, et ajoute ensuite chacun dans un contrôle de liste. Y at-il une façon plus élégante de le faire? Je sens que je répète le code chaque fois que je fais ceci ou quelque chose de similaire.
La solution
Eh oui, LINQ to Objects est votre ami:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
La partie Select
projette chaque ChangeLogType
à un ListItem
, et ToList()
convertit la séquence résultant en une List<ListItem>
.
Ceci est en supposant que vous vouliez vraiment nouvelle liste avec toutes ces entrées. Si vous avez besoin d'ajouter les résultats à une existant , vous feriez sans que l'appel ToList
, mais appelant AddRange
sur une liste existante avec le résultat de l'appel Select
.
Il est bien l'apprentissage vaut plus sur LINQ en général et aux objets LINQ en particulier -. Il peut faire toutes sortes de choses comme ça beaucoup plus simple
Autres conseils
var range = Types.Select(rec =>
new ListItem { Text = rec.Type, Value = rec.ID.ToString() });
LstChangeLogType.AddRange(range);
LINQ?
LstChangeLogType.Items = Types.Select(x => new ListItem()
{ Text = x.Type, Value = x.ID.ToString() }).ToList();
using System.Linq;
var items = Types
.Select (rec => ListItem
{
Text = Rec.Type;
Value = Rec.ID.ToString();
}
LstChangeLogType.Items.AddRange(items);
En utilisant des méthodes d'extension LINQ:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());