2013-02-05 17 views
6

Ich muss Paare/Tripel von etwas erstellen und irgendwo speichern. Wie kann ich es tun?Liste der anonymen Typen?

Ich habe versucht:

for (int i = 0; i < 100; i++) 
{ 
    var item=new { a=i , b="lala" ,c=4.5m}; //anonymous type 
} 

Aber dann dachte ich: List<what>?

Ich könnte dynamische verwenden, aber ich möchte Intellisense.

(Ich könnte auch Tuple<int,string,decimal> verwenden, aber wenn ich schon habe, was ich brauche (=new { a=i , b="lala" ,c=4.5m};), warum sollte ich eine andere Art verwenden (Tupel)?)

Gibt es eine Lösung für dieses?

+0

Wird "etwas" von einer Schnittstelle oder einer Klasse abgeleitet? – daryal

+0

nein. Ich erstelle es im laufenden Betrieb. (wie in meinem Beispiel) –

+0

Meinst du, Sie möchten eine Liste des anonymen Typs erstellen? –

Antwort

14

können Sie Typinferenz verwenden

var items = Enumerable.Range(0,100) 
         .Select(i => new { a=i , b="lala", c=4.5m }) 
         .ToList(); // not necessary (you can use IEnumerable) 
+0

ToList verhindert bereits das eingefangene var issue.right? –

+0

@RoyiNamir Sorry, habe nicht verstanden, was du mit * Capture var issue * meinst. Wenn Sie Elemente mehrmals verwenden möchten, ist es besser, 'ToList()' oder 'ToArray()' zu verwenden. Wenn Sie Elemente einmal iterieren möchten, verwenden Sie einfach IEnumerable 'anonymen Typs (weitere Aufzählungen werden neue Elemente erstellen). Deshalb habe ich diesen Kommentar zu 'ToList()' hinzugefügt. –

3

Nicht sicher, wie Sie füllen Felder innerhalb for, aber könnten Sie versuchen:

var lstOfSmth = Enumerable.Range(0, 100) 
          .Select(i => new { a = i, b = "lala", c = 4.5m }) 
          .ToList(); 
2

warum sollte ich eine andere Art (Tupel) verwenden

Weil sie genau für diesen Zweck entworfen wurden. Wenn Sie Angst vor einem ausführlichen Code haben, kommt auch die Direktive using zu Hilfe.

using myPair = Tuple<int,string>; 
using myTriple = Tuple<int,string,decimal>; 
//... 
for (int i = 0; i < 100; i++) 
{ 
    myPair pair = new myPair(1,"string"); 
    myTriple triple = new myTriple(i,"lala", 4.5); 
} 
+2

Alex - die 4,5 m ist keine Maßeinheit (es ist nicht Meter). Es erzwingt, dass die 4,5 statt einer Gleitkommazahl eine Dezimalzahl ist, was numerisch gesehen eine Welt der Differenz ist. – Eilon

+0

http://www.dotnetperls.com/suffix –

+0

Oh Schande, ich habe es verpasst. Ich werde die Dinge regeln – Alex