476 Stimmen

Eine generische Liste anonymer Klassen

In C# 3.0 können Sie anonyme Klassen mit der folgenden Syntax erstellen

var o = new { Id = 1, Name = "Foo" };

Gibt es eine Möglichkeit, diese anonymen Klassen zu einer generischen Liste hinzuzufügen?

Exemple :

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 weiteres Beispiel:

List<var> list = new List<var>();

while (....)
{
    ....
    list.Add(new {Id = x, Name = y});
    ....
}

488voto

Jon Skeet Punkte 1325502

Das könnten Sie tun:

var list = new[] { o, o1 }.ToList();

Es gibt viele Möglichkeiten, diese Katze zu häuten, aber im Grunde werden sie alle irgendwo Typinferenz verwenden - was bedeutet, dass Sie eine generische Methode aufrufen müssen (möglicherweise als Erweiterungsmethode). Ein anderes Beispiel könnte sein:

public static List<T> CreateList<T>(params T[] elements)
{
     return new List<T>(elements);
}

var list = CreateList(o, o1);

Sie haben die Idee:)

125voto

Dutt Punkte 1171

Hier ist die Antwort.

string result = String.Empty;

var list = new[]
{ 
    new { Number = 10, Name = "Smith" },
    new { Number = 10, Name = "John" } 
}.ToList();

foreach (var item in list)
{
    result += String.Format("Name={0}, Number={1}\n", item.Name, item.Number);
}

MessageBox.Show(result);

79voto

Paul Rouleau Punkte 741

Es gibt viele Möglichkeiten, dies zu tun, aber einige der Antworten hier sind die Erstellung einer Liste, die Müll-Elemente enthält, die Sie benötigen, um die Liste zu löschen.

Wenn Sie nach einer leeren Liste des generischen Typs suchen, verwenden Sie ein Select gegen eine Liste von Tupeln, um die leere Liste zu erstellen. Es werden keine Elemente instanziiert.

Hier ist der Einzeiler zum Erstellen einer leeren Liste:

 var emptyList = new List<Tuple<int, string>>()
          .Select(t => new { Id = t.Item1, Name = t.Item2 }).ToList();

Dann können Sie es mit Ihrem generischen Typ ergänzen:

 emptyList.Add(new { Id = 1, Name = "foo" });
 emptyList.Add(new { Id = 2, Name = "bar" });

Alternativ können Sie die leere Liste auch wie folgt erstellen (ich bevorzuge jedoch das erste Beispiel, da Sie es auch für eine bevölkerte Sammlung von Tupeln verwenden können):

 var emptyList = new List<object>()
          .Select(t => new { Id = default(int), Name = default(string) }).ToList();

54voto

Jeff Moser Punkte 19228

Nicht genau, aber man kann sagen List<object> und die Dinge werden funktionieren. Wie auch immer, list[0].Id wird nicht funktionieren.

Dies wird funktionieren während der Laufzeit in C# 4.0 durch eine List<dynamic> d.h. Sie erhalten kein IntelliSense.

40voto

Bassem Punkte 2300

Wenn Sie C# 7 oder höher verwenden, können Sie Tupeltypen anstelle von anonymen Typen.

var myList = new List<(int IntProp, string StrProp)>();
myList.Add((IntProp: 123, StrProp: "XYZ"));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X