我尝试将新记录添加到我的列表并更改它的数据,但它更改了所有数组记录,这是我的类和代码:
班级:
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,但我只是尝试更改一个数组记录
答案 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]的副本。