2010-06-01 4 views
9

Die Datenbank unseres Kunden gibt eine Menge von Preisen in einem Array zurück, aber sie enthalten manchmal nicht alle Preise, d. H. Sie haben fehlende Elemente in ihrem Array. Wir geben das zurück, was wir als IList finden, was sehr gut funktioniert, wenn wir Inhalte aus der Datenbank abrufen. Wir haben jedoch Schwierigkeiten, die Elemente in der richtigen Position im Array zu setzen.Hinzufügen eines IList-Elements zu einer bestimmten Indexnummer

Ist es möglich, eine IList zu erstellen und dann ein Element an einer bestimmten Position in der IList hinzuzufügen?

var myList = new List<Model>(); 
var myModel = new Model(); 
myList[3] = myModel; // Something like what we would want to do 
+0

Ihre Frage ist nicht ganz klar. Ich habe geantwortet, was ich * denke * du fragst, aber wenn du ein bisschen darüber nachdenken könntest, was du versuchst, könnte ich vielleicht eine bessere Antwort geben. –

+0

Ich denke, die Antwort ist eine Kombination aus Matts und Ismails. Ich möchte ein Element an Position 3 einfügen, aber es ist noch nichts in der Liste vorhanden. Laut Matts Antwort muss ich eine leere Liste erstellen, in die der Count> Index eingefügt werden soll, und dann Ismails Antwort verwenden, um sie tatsächlich einzufügen. Das andere Problem ist, dass die Einfügung alle Dinge darüber schieben wird, also muss ich fast alle fehlenden Einträge vor 3 erstellen, dann .Add(). Nun, zumindest versuche ich das zu tun. LOL –

+0

Sie wollen es eigentlich nicht * einfügen *, oder? Wenn die Liste genügend Elemente enthält, möchtest du nicht einfach die an dem bestimmten Element überschreiben? Das ist was "myList [3] = myModel;" tut. –

Antwort

3

Listen werden dynamisch für die Aufnahme von Elementen erweitert, wenn sie hinzugefügt werden. Sie müssten die Liste mit einer vordefinierten Größe initialisieren. Der einfachste Weg, von dem ich denken kann, das zu tun wäre:

var myList = new Model[100].ToList(); 

Das wird Ihr mit 100 Artikeln eine Liste geben, die alle null. Sie können dann myList [3] einen Wert zuweisen.

Beachten Sie, dass Sie in Ihrem Code versuchen, eine IList<Model> zu instanziieren, die nicht möglich ist - Sie benötigen einen konkreten Typ (wie List<Model>) anstelle einer Schnittstelle.

+0

Was ich tun möchte, ist ein neues Element in Position 3 zu stecken, aber anscheinend müssen Listen zusammenhängend sein, also muss ich leere Elemente an Positionen niedriger als 3 erstellen und dann ein neues Element einfügen. –

+0

Ok, also meine Antwort ist eine Möglichkeit, das zu tun. Füllen Sie die Liste mit Null-Elementen auf (bis zu dem Höchstbetrag, von dem Sie denken, dass er benötigt wird) und weisen Sie dann nur die gewünschten zu. –

17

Verwenden IList<T>.Insert(int index,T item)

IList<string> mylist = new List<string>(15); 
mylist.Insert(0, "hello"); 
mylist.Insert(1, "world"); 
mylist.Insert(15, "batman"); // This will throw an exception. 

Von MSDN

Wenn der Index die Anzahl der Elemente in der IList entspricht, wird dann Element in die Liste angehängt.

In Auflistungen zusammenhängender Elemente, z. B. Listen, werden die Elemente nach dem Einfügepunkt nach unten verschoben, um das neue Element aufzunehmen. Wenn die Auflistung indiziert ist, werden die Indizes der Elemente, die verschoben werden, ebenfalls aktualisiert. Dieses Verhalten gilt nicht für Sammlungen, in denen Elemente konzeptionell in Gruppen gruppiert sind, z. B. eine Hashtabelle.

0

Es wird einfügen und die Größe, wenn

benötigt
public static IList<T> InsertR<T>(this IList<T> ilist, int index, T item) { 

     if (!(index < ilist.Count)) { 

      T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

      ilist.CopyTo(array, 0); 

      array[index] = item; 

      if (ilist.GetType().IsArray) { 
       ilist = array; 
      } else { 
       ilist = array.ToList(); 
      } 


     } else 
      ilist[index] = item; 

     return ilist; 

    } 

oder

public static IList InsertR<T>(this IList ilist, int index, T item) { 

      if (!(index < ilist.Count)) { 

       T[] array = Array.CreateInstance(typeof(T), index + 1) as T[]; 

       ilist.CopyTo(array, 0); 

       array[index] = item; 

       if (ilist.GetType().IsArray) { 
        ilist = array; 
       } else { 
        ilist = array.ToList(); 
       } 


      } else 
       ilist[index] = item; 

      return ilist; 

     }