2010-12-27 16 views
0

Ich habe eine DocumentList.c wie unten implementiert. Und wenn ich versuche, eine Liste in die Instanz von Document hinzufügen Objekt fügt es aber die andere die gleichenC# Liste in Liste hinzufügen

 class DocumentList 
    { 
     public static List wordList; 
     public static string type; 
     public static string path; 
     public static double cos; 
     public static double dice; 
     public static double jaccard; 
     //public static string title; 

     public DocumentList(List wordListt, string typee, string pathh, double sm11, double sm22, double sm33) 
     { 
      type = typee; 
      wordList = wordListt; 
      path = pathh; 
      cos = sm11; 
      dice = sm22; 
      jaccard = sm33; 
     } 
    } 

in Haupt C# Codefragment seiner

 
public partial class Window1 : System.Windows.Window 
    { 

     static private List documentList = new List(); 

... 

in einer Methode, die ich als unten.

 
DocumentList dt = new DocumentList(para1, para2, para3, para4, para5, para6); 
       documentList.Add(dt); 

Wenn ich jetzt die erste Liste hinzuzufügen ist ok es scheint ein Artikel in dokumenten, aber für die zweite erhalte ich eine Liste mit 2 Einzelteile aber beide die gleiche ..

ich meine ich kann nicht vorheriges Listenelement halten, anstatt eine allgemeines List<T> ..

+0

möchten Sie möglicherweise die Add-Methode anzeigen, (da DocumentList scheint eine Basisklasse zu sein). Ist das auch .NET v2.0 oder höher? –

+0

Welche .NET-Version verwenden Sie? Wenn Sie sich nicht sicher sind, können Sie uns vielleicht mitteilen, welche Version von Visual Studio (oder welche IDE) Sie verwenden? – Shimmy

Antwort

3

Der Grund für das Überschreiben der Werte besteht darin, dass Sie alle Felder als static markiert haben. Statische Felder, Eigenschaften und Methoden werden von allen Instanzen der Klasse gemeinsam genutzt.

Darüber hinaus verwenden Sie List<string> und sparen Sie sich die Kopfschmerzen von hin und her werfen.

+0

Danke Brook – gencay

4

Gebrauch, wird es leichter sein, zu lesen und zu verstehen, und wird viel weniger Leistung kosten (Read this für mehr auf Generika):

class DocumentList 
{ 
    //via a (non-static - read link below) field: 
    public List<string> wordList; 

    //via a property (read link below): 
    public List<string> WordList { get; set; } 
    //---------- 
    public DocumentList(List<string> wordList, ..... 
    { 
     //Sets property 
     this.WordList = wordList; 

     //Sets field 
     this.wordList = wordList; 
     //etc. 
    } 
} 


private partial class Window1 
{ 
    private List<DocumentList> documentList = new List<DocumentList>(); 
} 

Das Schlüsselwort this bezieht sich auf die aktuelle Instanz (d. H. Mitglieder in der DocumentList Klasse erklärt).

Was ich nicht verstehe ist, warum möchten Sie alle Ihre Mitglieder als statisch deklarieren, und wenn es unveränderlich ist, sollten Sie es auch als readonly deklarieren, sobald Sie Ihre Felder als statisch markieren, deren gemeinsame Alle Instanzen und daher die Werte der verschiedenen Elemente in der Liste beziehen sich auf den gleichen Wert, den sie gemeinsam haben. Sobald Sie ein Mitglied aktualisieren, aktualisiert es das Feld "shared" und Sie sehen in allen Feldern denselben Wert. Ich würde Ihnen wärmstens empfehlen, this zu lesen.

Eine andere gute Idee wäre, Ihre Felder mit properties zu verpacken.

+0

Ich benutze bereits diese Implementierung, aber es ist nicht hier neu gesehen, dass ich das erkannt habe. Natürlich ist es so: öffentliche statische Liste wordList; – gencay

+0

Warum verwenden Sie 'statisch'? static sollte verwendet werden, wenn Sie die gleiche Instanz (der 'wordList' usw.) teilen wollen, auf die von externen Klassen/Threads/etc. zugegriffen werden soll.Bitte lesen Sie den Link zur Verwendung von 'static' und' readonly'. – Shimmy

+0

Ja ich habe Hilfe von dir gelöst Shimmy Vielen Dank .. – gencay

2

Das Problem ist, dass Sie alle Ihre Klassenmitglieder als statisch deklariert haben. Dies bedeutet, dass alle Ihre Instanzen die gleichen Werte teilen und Änderungen an einem Objekt auch alle anderen betreffen. Entfernen Sie das statische Schlüsselwort, sodass jede Instanz über eigene Daten verfügt.

class DocumentList 
{ 
    public List wordList; 
    // etc... 

Auch als eine Frage des Stils sollten Sie keine öffentlichen Felder haben. Entweder sie privat machen oder sie in Eigenschaften verwandeln. Sie können auch in Betracht ziehen, nur den Getter öffentlich zu machen.

+0

Danke Mark, das war das Problem, es ist gelöst. – gencay