2016-07-21 6 views
1

Ich dachte, ich wäre clever, aber ich lag falsch. Für einen Komponententest benötige ich eine Liste von X-Mengen und einige Werte in jedem der Elemente in der Liste. Also kam ich auf eine prägnante Art dorthin zu gelangen.Initialisiere eine Liste <T> mit einem Array und bevölkern

List<PlanList> planList = new List<PlanList>(new PlanList[7]); 
planList.ForEach(c => c.Description = "I'm a Description"); 
planList.ForEach(c => c.OrderPosition = 1); 

Es stellt sich jedoch heraus, dass ich eine Liste von 7 Null-Objekten bekomme.

enter image description here

Also ich bin gespannt, was passiert, aber was noch wichtiger ist versuche ich nur, um schnell eine Liste mit 7 Objekt zu erzeugen, die alle die gleichen Werte für meinen Test haben kann.

+4

Sie haben ein Array mit 7 Elementen erstellt. Wie Sie sehen können, haben Sie die Elemente nicht initialisiert, so dass sie alle null sind. –

Antwort

5

Sie haben kein Objekt für jeden Index des Arrays erstellt. Ich kann keine new PlanList() sehen. So erstellt man eine Reihe von Länge 7 Haltestandardwerte für Referenztyp PlanList das ist NULL

Ihr Code ein NullReferenceExpcetion im ForEach werfen sollte!

würde ich dies tun:

List<PlanList> planList = (from index in Enumerable.Range(0, 7) 
          select new PlanList() 
          { 
           Description = "I'm a Description", 
           OrderPosition = index 
          }).ToList(); 
+0

Ich denke OP möchte 'OrderPosition = 1' anstelle von' OrderPosition = x'. –

+0

@ S.Akbari Er kann es ändern, ich denke, er konnte keinen Zähler in "ForEach" haben, deshalb hat er alle auf 1 gesetzt. Ich habe das nur mit Enumerable.Range gezeigt. – user3185569

+0

OP sagte: * Ich versuche nur schnell eine Liste mit 7 Objekt zu generieren, die alle die gleichen Werte für meinen Test haben können * –

5

Ich vermute, dass PlanList ein struct hier, nicht wahr? (keine new, und Werte verloren).

Mit einem struct, wenn Sie ein Element von die Liste holen, haben Sie eine Kopie. Wenn Sie die Kopie mutieren: das Original weiß es nicht oder kümmert es nicht.

Grundsätzlich sollten die meisten Ihrer Probleme behoben werden, indem PlanList eine class gemacht wird. Es ist sehr ungewöhnlich, struct s in den meisten normalen C# -Code zu erstellen.

Beachten Sie, dass Sie die Instanzen erstellen müssen. Wenn es nach mir, würde ich nur verwenden (wo PlanList ist ein class):

var list = new List<PlanList>(); 
for(int i = 0 ; i < 7 ; i++) 
    list.Add(new PlanList { Description = "foo", OrderPosition = 1}); 
+0

Nicht eine Struktur es ist eine Klasse Ich weiß einfach nicht die Syntax, um es zu initialisieren, wie jeder sagt. – GPGVM

+0

@GPGVM dann sollte Ihr Code bereits mit einer "NullReferenceException" –

+0

@GPGVM explodiert sein, aber selbst dann wird der Code oben instanziiert sie korrekt –

2

Wenn Sie ein neues Array erstellen new PlanList[7], alle Elemente innerhalb des Arrays werden für diesen Typ auf den Standardwert initialisiert werden (Siehe default keyword). In Ihrem Fall ist der Standardwert für PlanListnull.

Sie müssen jedes Element manuell initialisieren.

Eine Möglichkeit, dies zu tun:

for(int i = 0; i < planList.Count; i++) 
    planList[i] = new PlanList(); 
8

Es scheint, dass Sie so etwas wie dies gesuchte:

List<PlanList> planList = Enumerable 
    .Range(0, 7) 
    .Select(index => new PlanList() { 
    Description = "I'm a Description", 
    OrderPosition = 1 
    }) 
    .ToList(); 

dh 7PlanList Instanzen erstellen und sie als Liste materialisieren .

Verwandte Themen