In C # 3.0 können Sie eine anonyme Klasse mit der folgenden Syntax erstellen
var o = new { Id = 1, Name = "Foo" };
Gibt es eine Möglichkeit, diese anonymen Klassen einer generischen Liste hinzuzufügen?
Beispiel:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Ein anderes Beispiel:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
DHornpout
quelle
quelle
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Antworten:
Du könntest es tun:
Es gibt viele Möglichkeiten, diese Katze zu häuten, aber im Grunde verwenden sie alle irgendwo Typinferenz - was bedeutet, dass Sie eine generische Methode aufrufen müssen (möglicherweise als Erweiterungsmethode). Ein anderes Beispiel könnte sein:
Du hast die Idee :)
quelle
Hier ist die Antwort.
quelle
string.Join
und String - Interpolation, so dass keine Notwendigkeit zu verwendenforeach
undFormat
.Es gibt viele Möglichkeiten, dies zu tun, aber einige der Antworten hier erstellen eine Liste mit Müllelementen, für die Sie die Liste löschen müssen.
Wenn Sie nach einer leeren Liste des generischen Typs suchen, verwenden Sie eine Auswahl gegen eine Liste von Tupeln, um die leere Liste zu erstellen. Es werden keine Elemente instanziiert.
Hier ist der Einzeiler, um eine leere Liste zu erstellen:
Dann können Sie es mit Ihrem generischen Typ hinzufügen:
Alternativ können Sie wie folgt vorgehen, um die leere Liste zu erstellen (ich bevorzuge jedoch das erste Beispiel, da Sie es auch für eine aufgefüllte Sammlung von Tupeln verwenden können):
quelle
Enumerable.Empty<object>().Select(o=>definition).ToList()
Nicht genau, aber man kann sagen
List<object>
und die Dinge werden funktionieren. Funktioniert jedochlist[0].Id
nicht.Dies funktioniert zur Laufzeit in C # 4.0 mit einem
List<dynamic>
, dh Sie erhalten IntelliSense nicht.quelle
ich vermute
wird funktionieren.
Sie könnten es auch so schreiben:
quelle
Normalerweise benutze ich Folgendes: hauptsächlich, weil Sie dann mit einer Liste "beginnen", die leer ist.
In letzter Zeit habe ich es stattdessen so geschrieben:
Mit der Wiederholungsmethode können Sie außerdem Folgendes tun:
..die gibt Ihnen die erste Liste mit dem ersten bereits hinzugefügten Element.
quelle
Sie können dies in Ihrem Code tun.
quelle
In der neuesten Version 4.0 kann Dynamic wie unten verwendet werden
quelle
Ich habe die IL auf mehrere Antworten überprüft. Dieser Code liefert effizient eine leere Liste:
quelle
IEnumerable
, während meine VersionList
genau das zurückgibt , was OP gefragt hat.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Hier ist mein Versuch.
Ich kam darauf, als ich etwas Ähnliches schrieb, um eine anonyme Liste für einen benutzerdefinierten Typ zu erstellen.
quelle
Sie können eine dynamische Liste erstellen.
"dynamisch" wird durch den ersten Mehrwert initialisiert.
quelle
An Stelle von:
Sie könnten dies tun:
Sie erhalten jedoch einen Kompilierungsfehler, wenn Sie versuchen, so etwas in einem anderen Bereich auszuführen, obwohl dies zur Laufzeit funktioniert:
Das Problem ist, dass zur Laufzeit nur die Mitglieder von Object verfügbar sind, obwohl Intellisense die Eigenschaften- ID und den Namen anzeigt .
In .net 4.0 besteht eine Lösung darin, das Schlüsselwort dynamic istead of object im obigen Code zu verwenden.
Eine andere Lösung besteht darin, Reflexion zu verwenden, um die Eigenschaften zu erhalten
quelle
Hier ist eine weitere Methode zum Erstellen einer Liste anonymer Typen, mit der Sie mit einer leeren Liste beginnen können, aber dennoch Zugriff auf IntelliSense haben.
Wenn Sie das erste Element behalten möchten, geben Sie einfach einen Buchstaben in die Zeichenfolge ein.
quelle
quelle
Dies ist eine alte Frage, aber ich dachte, ich würde meine C # 6-Antwort eingeben. Ich muss oft Testdaten einrichten, die einfach als Liste von Tupeln in den Code eingegeben werden können. Mit ein paar Erweiterungsfunktionen ist es möglich, dieses schöne, kompakte Format zu haben, ohne die Namen bei jedem Eintrag zu wiederholen.
Dies ergibt eine IEnumerable - wenn Sie eine Liste möchten, die Sie hinzufügen können, fügen Sie einfach ToList () hinzu.
Die Magie kommt von der benutzerdefinierten Erweiterung Add-Methoden für Tupel, wie unter https://stackoverflow.com/a/27455822/4536527 beschrieben .
}}
Das einzige, was mir nicht gefällt, ist, dass die Typen von den Namen getrennt sind. Wenn Sie jedoch wirklich keine neue Klasse erstellen möchten, können Sie mit diesem Ansatz trotzdem lesbare Daten erhalten.
quelle
Ich bin sehr überrascht, dass niemand Sammlungsinitialisierer vorgeschlagen hat. Auf diese Weise können nur Objekte hinzugefügt werden, wenn die Liste erstellt wird, daher der Name. Dies scheint jedoch die beste Methode zu sein. Sie müssen kein Array erstellen und dann in eine Liste konvertieren.
Sie können immer verwenden,
object
anstatt zudynamic
versuchen, es auf eine wirklich generische Weise zu halten, danndynamic
ist es sinnvoller.quelle
Sie können es so machen:
Es scheint mir ein wenig "hacky" zu sein, aber es funktioniert - wenn Sie wirklich eine Liste benötigen und nicht einfach das anonyme Array verwenden können.
quelle
In Ihrem zweiten Beispiel, in dem Sie eine neue initialisieren müssen
List<T>
, besteht eine Idee darin, eine anonyme Liste zu erstellen und diese dann zu löschen.Oder als Erweiterungsmethode sollte es einfacher sein:
Oder wahrscheinlich noch kürzer,
quelle
Aus dieser Antwort habe ich zwei Methoden entwickelt, mit denen die Aufgabe erledigt werden kann:
Sie können die Methoden wie verwenden
Diese Antwort hat eine ähnliche Idee, aber ich habe sie erst gesehen, nachdem ich diese Methoden gemacht habe.
quelle
Wenn Sie C # 7 oder höher verwenden, können Sie Tupeltypen anstelle von anonymen Typen verwenden.
quelle
Versuchen Sie es damit:
quelle
quelle