2016-11-30 5 views
1

Ich habe ein Objekt mit den Attributen String erstellt, und das andere ist ein List<String>. Ich habe auch eine static List<MyObject> erstellt, wo ich dann alle meine Objekte hinzufügen. Jetzt ist mein Problem das zweite Attribut wird überschrieben.Eigenes Klassenobjekt-Attribut wird überschrieben

Zum Beispiel habe ich drei Objekte:

Object1: "Name"; List with 3 Strings 
Object2: "Name2"; List with 2 Strings 
Object3: "Name3"; List with 5 Strings 

Wenn ich sie in meine Objektliste hinzufügen jetzt an, wie

Name; List with 5 Strings 
Name2; List with 5 Strings 
Name3; List with 5 Strings 

es die zweite Attribute in allen anderen Objekte außer Kraft setzen, so sieht Die Liste.

Code:

for (int i = 0; i < 100; i++) 
{ 
    if (elo.ReadObjMask(i) > 0) 
    { 
     var iRet = elo.PrepareObjectEx(0, 0, i); 
     maskenname = elo.ObjMName(); 
     if (maskenname != "") 
     { 
      for (int e = 0; e < 50; e++) 
      { 
       string eigenschaft = elo.GetObjAttribName(e); 

       if (eigenschaft != "" && eigenschaft != "-") 
       { 
        eigenschaften.Add(eigenschaft); 
       } 
      } 
      allMasks.Add(maskenname); 

     } 
     else 
     { 
      // Do nothing 
     } 
     EloMask emask = new EloMask(maskenname, eigenschaften); 
     staticVariables.allMask.Add(emask); 
     eigenschaften.Clear(); 
    } 
} 

Hier ist meine Objektklasse:

public class EloMask 
{ 
    public string name; 
    public List<String> eigenschaften; 

    public EloMask(string iname, List<String> ieigenschaften) 
    { 
     name = iname; 
     eigenschaften = ieigenschaften; 
    } 
} 
+0

Sie müssen den Code für Ihre „Objekt“ Klasse angeben und wie Sie instanziieren und zur Ergänzung der statischen Liste. – Thangadurai

+0

staticVariables.allMask.Add (emask); in diesem Teil füge ich es meiner statischen Liste hinzu – saamii

+0

Ich glaube das: EloMask emask = neue EloMask (maskenname, eigenschaften); wird Eigenschaften als Referenz übergeben, so wenn es geändert wird, werden auch alle anderen geändert. Sie müssen eine neue Instanz Ihrer Liste initiieren, bevor Sie sie schreiben. eigenschaften = neue Liste ; –

Antwort

1

Die List<string> verweist immer auf dieselbe Instanz, weil Sie einen Verweis auf die Liste übergeben, keine Kopie. Als Ergebnis wird die Liste für jede EloMask, an die Sie diese Liste übergeben, erneut gelöscht und gefüllt.

Ihr Problem zu beheben, erstellen Sie stattdessen eine neue Liste:

if (elo.ReadObjMask(i) > 0) 
{ 
    var iRet = elo.PrepareObjectEx(0, 0, i); 
    maskenname = elo.ObjMName(); 

    // create a new list here!!! 
    var eigenschaften = new List<string>(); 

    if (maskenname != "") 
    { 
     for (int e = 0; e < 50; e++) 
     { 
      string eigenschaft = elo.GetObjAttribName(e); 

      if (eigenschaft != "" && eigenschaft != "-") 
      { 
       eigenschaften.Add(eigenschaft); 
      } 
     } 

     allMasks.Add(maskenname); 

    } 

    EloMask emask = new EloMask(maskenname, eigenschaften); 
    staticVariables.allMask.Add(emask); 

    // clearing the list is no longer needed     
} 
0

Hier ist ein Beispiel, wie Sie tun können, was Sie wollen:

public static List<Person> PersonsList = new List<Person>(); 
    public static Random rd = new Random(); 
    static void Main(string[] args) 
    { 

     for (int i = 0; i < 5; i++) 
     { 
      List<string> tmpAbilities = new List<string>() {((char)rd.Next(255)).ToString(), ((char)rd.Next(255)).ToString() , ((char)rd.Next(255)).ToString() }; 
      Person tmpPerson = new Person("TmpName_"+i,tmpAbilities); 
      PersonsList.Add(tmpPerson); 
     } 
     foreach (var persona in PersonsList) 
     { 
      Console.WriteLine(persona); 
     } 
    } 


    public class Person 
    { 

     public string Name { get; set; } 

     public List<string> Abilities; 

     public Person(string name,List<string> abilities) 
     { 
      Name = name; 
      Abilities = abilities; 
     } 

     public override string ToString() 
     { 
      string retVal = $"Name: {Name}\n"; 
      foreach (var ability in Abilities) 
      { 
       retVal += $"Ability : {ability}\n"; 
      } 
      return retVal; 
     } 
    } 
0
 for (int i = 0; i < 100; i++) 
     { 

      if (elo.ReadObjMask(i) > 0) 
      { 
       // Create a new listin here 
       eigenschaften = new List<string>(); 

       var iRet = elo.PrepareObjectEx(0, 0, i); 
       maskenname = elo.ObjMName(); 
       if (maskenname != "") 
       { 
        for (int e = 0; e < 50; e++) 
        { 
         string eigenschaft = elo.GetObjAttribName(e); 

         if (eigenschaft != "" && eigenschaft != "-") 
         { 
          eigenschaften.Add(eigenschaft); 
         } 
        } 
        allMasks.Add(maskenname); 

       } 

       else 
       { 
        // Do nothing 
       } 
       EloMask emask = new EloMask(maskenname, eigenschaften); 
       staticVariables.allMask.Add(emask); 
      } 
     } 
+0

Danke Troja! Sie fehlen() hier: Eigenschaften = neue Liste ; – saamii

+0

Danke. Rushing zu viel;) Nur den Code aktualisiert. –

+0

Kein Problem, ich danke Ihnen vielmals! Ich kämpfte gestern 3 Stunden haha: D – saamii

Verwandte Themen