2016-03-19 4 views
-3

Ich habe einen Timer mit der Zecke Funktion:Warum wird "Liste <T> .Insert (index, T)" am Ende der Liste statt Index hinzugefügt?

void CollisionTimer_Tick(object sender, EventArgs e) 
    { 
     int j; 
     angle += 10; 
     angle %= 360; 

     int i = angle/10 - 1; 
     if (i < 0) 
      j = 0; 
     else 
      j =i % 35; 

     ObstaclePoints.Insert(j, getPoint(angle)); 
    } 

Die gewünschte Wirkung ist die Punktliste ‚ObstaclePoints‘ erhält 36 Punkte als j iteriert zwischen 0-35.

Das Problem, das ich bekomme, ist nach den ersten 36 Ticks und j geht zurück zu 0, die Liste wird hinzugefügt, und ich bekomme mehr als 36 Punkte in meiner Liste. (d. h. nach weiteren 36 Ticks erhalte ich 72 Punkte in meiner Liste, anstatt die ersten 36 zu überschreiben).

Warum passiert das und wie kann ich das beheben?

+0

Welche Sprache ist das? Es sieht so aus, als wäre es [tag: C++], aber ich sehe dieses Tag nicht. –

+1

War auch nicht C, downvoted. –

+0

@iharob - Es ist C#, das Tag ist da. – martinstoeckli

Antwort

3

List.Insert überschreibt das Objekt nicht am angegebenen Index, sondern fügt eins an dieser Position ein. Verwenden Sie ein Array ObstaclePoints[35] statt einer Adresse es wie der folgende Code zeigt:

ObstaclePoints[j] = getPoint(angle); 
+3

Dies würde auch mit einer Liste arbeiten. Es muss * kein Array sein. – Clemens

+1

@Clemens Denken Sie außerdem daran, die Elemente zur Liste hinzuzufügen, bevor Sie versuchen, auf sie zuzugreifen. – Kyle

+0

@Clemens OK, aber wenn die Anzahl der Liste konstant ist, bevorzuge ich ein Array. Wenn Sie eine Liste verwenden, müssen Sie zuerst die Elemente hinzufügen, bevor Sie auf das Objekt zugreifen, wie von Kyle erwähnt. – KnorxThieus

Verwandte Themen