更新1对象的属性时,它更新列表中其余相同对象的属性

时间:2016-06-22 10:41:30

标签: c# linq

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);
        }
    }
}

}

因此,在更新ReqId时,它会更新列表中存在的所有对象。在最后一次迭代中,它为list中的所有对象分配相同的值。它是因为从字典或任何引用问题中获取它而发生的。 我想给ReqId一个唯一的id。

2 个答案:

答案 0 :(得分:2)

这是因为您创建了一个对象,并继续将其添加到循环列表中。

您的词典d1只包含一个对象 - 此处添加的对象:

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

拉两次并分配到emp并不会复制它 - 您将同一个对象添加到lstEmp

为了解决此问题,您需要制作Employee对象的副本,而不是重复使用它:

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

答案 1 :(得分:1)

是的,这是由于参考问题。类是引用类型。此外,您不是在创建班级员工的对象。你是一次又一次地指同一个字典项目。

    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);
        }
    }