更改班级列表的数据

时间:2017-09-09 04:22:58

标签: c# arrays list

我尝试将新记录添加到我的列表并更改它的数据,但它更改了所有数组记录,这是我的类和代码:

班级:

 public class TransportDto
{
        public int type { get; set; }
        public string url { get; set; }
        public int Relationship { get; set; }
}

将数据加载到我的列表中:

IQueryable<TransportDto> list = _entities.Database.SqlQuery<TransportDto>(filterExpression).AsQueryable();


List<TransportDto> lst = list.ToList();
TransportDto help =lst[1];// adding record like one of my result
lst.Add(help);

现在我尝试更改lst [lst.Count-1]的值但是当我更改它时,lst [1]也会改变

lst[lst.Count-1].type=3;

结果,lst [lst.Count-1]和lst [1]变为3,但我只是尝试更改一个数组记录

1 个答案:

答案 0 :(得分:1)

当您编写TransportDto help =lst[1];时,您将获得索引为1的对象。当您将此对象添加到列表中时,您将相同对象添加到列表中而不是它的副本。 这意味着在列表中,索引1和lst.Count-1指向同一个对象。当您以lst[lst.Count-1]访问对象时,您正在访问此对象,.type=3对两个索引指向的对象进行更改。

如果您想在lst [1]中获得该对象的副本,请考虑克隆该对象。这可以制作对象的副本。您可以在这里参考:How to Clone Objects

为了简化,在您的情况下,您可以创建一个这样的克隆函数:

public class TransportDto
{
    public int type { get; set; }
    public string url { get; set; }
    public int Relationship { get; set; }

    public TransportDto Clone(){
        return new TransportDto{
            type = type,
            url = url,
            Relationship = Relationship
        };
    }
}

此克隆函数创建TransportDto的新对象并传递相同的值,从而创建副本。现在,在列表中,您可以执行此操作:

TransportDto help =lst[1].Clone();

现在帮助存储lst [1]的副本。