2016-05-02 6 views
-3

ToolMy Problem, wenn ich ein neues Element zu einer Liste hinzufügen dieses Element überschreiben alle anderen Elemente vor.Liste überschreiben Daten auf allen Positionen vor

public static List<Tool_OP> list = new List<Tool_OP>(); 
BinaryReader fs = new BinaryReader(File.Open(FileName, FileMode.Open)); 
do 
{ 
    Tool_OP item = new Tool_OP(); 
    if (!item.ReadRecord(fs)) break; 
    list.Add(item); 
} while (true); 
fs.Close(); 

Hier ist ein Teil meiner Record-Klasse. Mein Datensatz ist OK, wenn ich debbug. Ich weiß nicht, warum meine Liste bei jedem Hinzufügen alle Artikel mit meinem tatsächlichen Artikel überschreibt. Ich habe eine ReadString-Methode, um Strings aus meiner Binärdatei zu erhalten.

class Tool_OP 
{ 
    public static string  comment; 
    public static long  op_idn; 

    public static string ReadString(int max, BinaryReader fs) 
    { 
     byte[] Buf = new byte[max]; 
     string NewStr = ""; 
     Buf = fs.ReadBytes(max); 

     for (int ii = 0; ii < max; ii++) 
     { 
      if (Buf[ii] == 0) return NewStr; 
      NewStr = NewStr + Convert.ToChar(Buf[ii]); 
     } 
     return NewStr; 
    } 

    public Boolean ReadRecord(BinaryReader fs) 
    { 
     comment = ReadString(120, fs); 
     op_idn = fs.ReadInt32(); 
    } 
} 
+2

Ich denke, dass Sie das Problem falsch diagnostizieren (oder ich missverstanden die Frage), aber es gibt keine Informationen, um dies zu bestimmen. –

+1

Wollen Sie sagen, dass Sie die Liste löschen möchten, wenn Sie die Daten einlesen? Oder sagen Sie, dass alle Einträge in der Liste die gleichen Daten vom letzten Datensatz haben? –

+1

Ich werde sagen, dass alle Elemente die gleichen Daten aus dem letzten Datensatz haben –

Antwort

1

Da sagten Sie, das Problem ist, dass alle Datensätze die gleichen Daten haben (in Ihren Kommentar), das Problem ist die Tatsache, dass Sie die gleiche Instanz eines Objekts modifizieren und dann das Hinzufügen eines weiteren Verweis auf dieses Objekt in deiner Liste.

Ich empfehle einige Änderungen den Code klarer zu machen:

public static List<Tool_OP> list = new List<Tool_OP>(); 
BinaryReader fs = new BinaryReader(File.Open(FileName, FileMode.Open)); 
bool isValidReadRecord = true; 

while(isValidReadRecord) 
{ 
    Tool_OP item = new Tool_OP(); 
    isValidReadRecord = item.ReadRecord(fs); 

    if(isValidReadRecord) 
    { 
     list.Add(item); 
    } 
}; 
fs.Close(); 

Die wichtigsten Änderungen hier ist, dass wir nicht haben, etwas wie eine offene Schleife aussieht. Sie haben eine klare Bedingung, um die Schleife zu beenden. Und im Vergleich zu dem, was ich ursprünglich gesehen habe, ist das Tool_OP item jedes Mal neu instanziiert. Tool_OP item = new Tool_OP();

Wenn jeder Datensatz zu diesem Zeitpunkt die gleichen Daten enthält, müssen Sie sich ansehen, wie Tool_OP Daten speichert. Wenn die Informationen in static Feldern oder Eigenschaften gespeichert werden, haben sie alle die neusten Daten von item.ReadRecord().

In der Tat, mit Ihrer Bearbeitung wird es sehr deutlich! Entfernen Sie die static Stichwort:

class Tool_OP 
{ 
    public string  comment; 
    public long  op_idn; 
} 

Das static Schlüsselwort bedeutet, dass es in der gesamten Laufzeit für Ihre Klasse eine Definition dieses Feldes ist. Sie sind effektiv globale Werte. Verwenden Sie nur static, wenn Sie wirklich Daten für alle Instanzen einer Klasse freigeben möchten.

+0

fs ist nicht statisch. Es wird in eine ReadRecord-Submethode übergeben, die nicht statisch ist. Ich würde das Schlüsselwort ref verwenden. –

+0

Aber ich stimme zu, dass die Verwendung des Schlüsselworts statisch die Variable auf eine Instanz zwingt. Aber das heißt, er übergibt fs nach Wert und nicht durch Bezugnahme. –

+0

'Tool_OP.comment' und' Tool_OP.op_idn' waren statisch. 'fs' ist ein Heap-Objekt, daher reicht es aus, diesen Wert an die Methode zu übergeben. Sie müssten 'ref' verwenden, wenn' fs' eine Struktur wäre, was nicht der Fall ist. –

0

Vielen Dank an alle ...

Jetzt funktioniert es ohne statisch in der Tool_OP Klasse und der klaren Code!

+1

Achten Sie darauf, die richtige Antwort zu akzeptieren! –

+0

Ich kann meine löschen, wenn Sie bevorzugen. –

Verwandte Themen