2016-06-22 3 views
-3
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    public class Employee 
     { 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    private int reqId; 

    public int ReqId 
    { 
     get { return reqId; } 
     set { reqId = value; } 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Dictionary<int, Employee> d1 = new Dictionary<int, Employee>(); 
     d1.Add(1, new Employee { Name="Amol" });   

     List<Employee> lstEmps = new List<Employee>(); 
     Employee emp=null; 
     for(int i=0;i<2;i++) 
     { 
      emp = null; 
      emp = d1[1];     
      emp.ReqId = i; 
      lstEmps.Add(emp); 
     } 
    } 
} 

}während der Aktualisierung Eigenschaft für 1 Objekt seiner Aktualisierung Eigenschaften für Rest der gleichen Objekte in der Liste

So, während der Aktualisierung REQID seine für alle Objekte in der list.In die letzte Iteration immer aktualisiert wird, Zuweisen Derselbe Wert für alle Objekte in der Liste. Es passiert, weil es aus dem Wörterbuch oder einem Referenzproblem stammt. Ich möchte ReqId eine eindeutige ID geben.

+2

Nein. Sie haben nur eine Instanz der Klasse mit mehreren Referenzen. emp = d1 [1]; erstellt keine neue Instanz. –

Antwort

2

Dies liegt daran, dass Sie ein einzelnes Objekt erstellt und es in einer Schleife zu Ihrer Liste hinzugefügt haben.

Ihr Wörterbuch d1 enthält nur ein Objekt - das Objekt hinzugefügt hier:

d1.Add(1, new Employee { Name="Amol" });   

es zweimal Ziehen und machen emp Zuordnung nicht eine Kopie davon - Sie das gleiche Objekt lstEmp hinzuzufügen.

Um dieses Problem Sie eine Kopie Employee Objekt machen, müssen zu beheben, anstatt ihn erneut verwenden:

for(int i=0;i<2;i++) { 
    lstEmps.Add(new Employee { 
     Name = d1[1] 
    , ReqId = i 
    }); 
} 
+0

aber ich habe ein Echtzeit-Szenario, wo dies der Fall sein wird und zu unterscheiden, ich habe reqId Feld. Gibt es einen Weg, wie ich es erreichen kann? –

+0

@AmolKadam Sie müssen ein neues Objekt erstellen. Wenn Sie 'ReqId' jetzt auf' emp' setzen, ändert sich auch der Wert von 'd1 [1] .ReqId', weil Sie nur ein Objekt haben. – dasblinkenlight

+0

danke für die Lösung! Also muss ich jedes Feld des Mitarbeiterobjekts neu zuordnen. Gibt es eine Möglichkeit, eine Kopie eines Objekts zu erstellen? –

1

Ja, dies zu Referenz Problem zurückzuführen ist. Klasse ist ein Referenztyp. Außerdem erstellen Sie keine Objekte des Klassenmitarbeiters. Sie beziehen sich immer wieder auf dasselbe Wörterbuchelement.

private static void Main(string[] args) 
    { 
     Dictionary<int, Employee> d1 = new Dictionary<int, Employee>(); 
     d1.Add(1, new Employee { Name = "Amol" }); 

     List<Employee> lstEmps = new List<Employee>(); 
     Employee emp = null; 
     for (int i = 0; i < 2; i++) 
     { 
      emp = new Employee(); 
      emp.Name = d1[1].Name; 
      emp.ReqId = i; 
      lstEmps.Add(emp); 
     } 
    } 
Verwandte Themen