2016-05-26 18 views
2

Ich habe Probleme mit der verschachtelten Liste in C#. Ich beziehe eine Liste mit Excel-Daten. Dazu speichere ich alle Daten aus einer Spalte in subdlist2 und füge sie dann in meine Hauptliste termsList ein.
Am Ende, wenn ich den Inhalt meiner Liste anzeigen, sind die Werte nicht die aus mehreren Zeilen, sondern sie werden durch die Werte aus der letzten Spalte ersetzt. Wird der Inhalt der Liste als Referenz und nicht als Wert gespeichert?
Beispiel: Ich habe 5 Zeilen, mit unterschiedlichen Werten, die fünfte Werte ersetzen alle.C# verschachtelte Liste, die falsche Werte speichert

for (i = 0; i < num_speed; i++) 
    { 
     lastrow_current = GetLastUsedRow(currentWorksheet, 12 + i * 11); 
     for (int j = 0; j < lastrow_current; j++) 
     { 
      if (currentWorksheet.Cells[j + 6, 12 + i * 11].Value != null) 
      { 
       if (j == 0) 
       { 
        sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString()); 
       } 
       else 
       { 
       sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString()); 
       } 
      } 
     } 
     termsList.Add(sublist2); 
    } 
    termsList.Add(sublist2); 
    foreach (var sublist3 in termsList) 
    { 
     foreach (var value in sublist3) 
     { 
      Console.Write(value); 
      Console.Write(' '); 
     } 
     Console.WriteLine(); 
    } 
+0

Können Sie ein Beispiel für Daten und Ausgabe angeben? Wie auch immer, du erstellst nie eine neue Instanz für 'sublist2', also sind alle Mitglieder in' termsList' tatsächlich die gleiche Instanz der Liste, was inkorrekt sein sollte. –

Antwort

0

Es ist schwierig, aus Ihrem kurzen Beispiel zu sagen. Bitte aktualisieren Sie das Beispiel, so dass Sie die Initialisierung der Liste einschließen

Aber Liste ist in der Tat ein Referenzobjekt. Sie sollten für jede Zeile eine neue Liste erstellen.

Der Code sollte wie folgt aussehen:

var rows = new List<List<string>>(); 
for (row = 0; row < maxRow; row++) 
{ 
    var row = new List<string>(); 
    for (column = 0; column < maxColumn; column++) 
    { 
    var value = sheet[row, column]; 
    row.Add(value); 
    } 
    rows.Add(row); 
} 

Bitte beachten Sie, dass Sie Ihre Variablen einen eindeutigen Namen (nicht i, j) geben sollte. Auch, dass Sie temporäre Variablen verwenden, sollten Sie die Daten in setzen: nicht currentWorksheet.Cells setzen Sie [j + 6, 13 + i * 11] .Wert alle über den Ort, aber es benutzen, wenn

var value = currentWorksheet.Cells[j + 6, 13 + i * 11].Value; 

und dann wird der Wert resuse ...

0

es gibt viele Dinge, die in Ihrem Quellcode sind verwirrend, so erste versuche ich es ein wenig zu sortieren:

// List<List<string>> termsList = the list to fill with nested lists 
//  List<string> sublist2 = a list created outside the loop 
//     num_speed = number of columns to process 

for (i = 0; i < num_speed; i++) 
{ 
    var currentColumn = 12 + i * 11; // taken from if (currentWorksheet.Cells[j + 6, 12 + i * 11] 
    var differentColumn = 13 + i * 11; // taken from sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11] 

    var lastRowOfCurrentColumn = GetLastUsedRow(currentWorksheet, currentColumn); 

    for (int j = 0; j < lastRowOfCurrentColumn; j++) 
    { 
     var currentRow = j + 6; // taken from currentWorksheet.Cells[j + 6, 

     var currentCell = currentWorksheet.Cells[currentRow, currentColumn]; 
     var differentCell = currentWorksheet.Cells[currentRow, anotherColumn]; 

     // here you are checking if the cell has a value ... 
     if (currentCell.Value != null) 
// was if (currentWorksheet.Cells[j + 6, 12 + i * 11].Value != null) 
     { 
      if (j == 0) 
      { 
       // ... but here ... 
       sublist2.Add(differentCell.Value.ToString()); 
     // was sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString()); 
      } 
      else 
      { 
       // ... and here you are adding a value from a cell 
       // out of a different column to the list 
       sublist2.Add(differentCell.Value.ToString()); 
     // was sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString()); 
      } 
     } 
    } 

    // Here you are adding the same list to the parent list 
    // again and again for every row ... 
    termsList.Add(sublist2); 
} 

// ... and outside the loop you are adding that list again to the parent 
termsList.Add(sublist2); 

so außer der den Wert einer Überprüfung Zelle, aber mit dem Wert aus einer anderen Zelle, um die Liste hinzuzufügen, verwenden Sie die gleiche Liste an jede Reihe.

Um eine separate Liste für jede Zeile und auch die tatsächliche geprüfte Spalte zu verwenden, müssen Sie wie, dass Ihr Code ändern:

for (int j = 0; j < lastRowOfCurrentColumn; j++) 
{ 
    var listForRow = new List<string>(); 
// ... 
       listForRow.Add(currentCell.Value.ToString()); 
// ... 
    termsList.Add(listForRow); 
} 

Und die überflüssige Zugabe einer verschachtelten Liste entfernen außerhalb der Schleife .