C# eleganter Weg, um Array einer Liste zuzuweisen?
-
27-10-2019 - |
Frage
Ich habe das:
// 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);
}
Es ruft eine Funktion auf, die ein Array von Changelogtypen zurückgibt, und fügt dann jeden in eine Listensteuerung hinzu. Gibt es eine elegantere Art, dies zu tun? Ich habe das Gefühl, dass ich jedes Mal, wenn ich das oder ähnliches mache, Code wiederhole.
Lösung
Yup, linq zu Objekten ist dein Freund:
var changeLogTypes = ChangeLogFunctions.GetAllChangelogTypes()
.Select(x => new ListItem {
Text = x.Type,
Value = x.ID.ToString() })
.ToList();
Das Select
Teil ist projiziert, jeweils ChangeLogType
zu einem ListItem
, und ToList()
konvertiert die resultierende Sequenz in a List<ListItem>
.
Dies geht davon aus, dass Sie wirklich eine wollten Neu Listen Sie mit all diesen Einträgen auf. Wenn Sie die Ergebnisse zu einem hinzufügen müssen vorhandenen Liste, das würden Sie ohne die tun ToList
anrufen, aber anrufen AddRange
auf einer vorhandenen Liste mit dem Ergebnis der Select
Anruf.
Es lohnt sich, mehr über Linq im Allgemeinen und Linq für Objekte im Besonderen zu lernen - es kann alle möglichen Dinge wie so viel einfacher machen.
Andere Tipps
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);
Verwenden einiger Linq -Erweiterungsmethoden:
LstChangeLogType.AddItems.AddRange(
Types.Select(t =>
new ListItem() { Text = t.Type, Value = t.ID.ToString() }).ToArray());