![](/img/trans.png)
[英]How do I create a copy of a Dictionary<int,List<int>> without affecting the original (C#)?
[英]Copy/Edit from one list to another list without affecting the Original List C#
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string RestaurantName { get; set; }
}
List<UserModel> TempUserModelList = new List<Items>(OriginalList);
现在在编辑 TempUserModelList 中的项目时也会更改 OriginalList 中的原始值。
如何将 OriginalList 中的值复制到临时列表中,以免更改原始列表?
您可以在 UserModel object 中实现 ICloneable 接口
public class UserModel : ICloneable
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string RestaurantName { get; set; }
public object Clone()
{
var clone = (UserModel)MemberwiseClone();
return clone;
}
}
然后像这样执行复制:
List<UserModel> TempUserModelList = OriginalList.Select(s => (UserModel)s.Clone()).ToList();
我的建议是避免可变对象,而是拥抱不变性。 即将 class 的所有属性设为只读。 这使得推理对象变得更加容易,并且您永远不必担心对象的变化。 有关immutability 的好处的更多详细信息,请参阅此答案。
c# 9 中的记录类型使这相当容易,允许您编写:
TempUserModelList[0] = TempUserModelList[0] with { FirstName = "MyNewName"};
c# 10 允许将相同的语法用于结构和匿名类型。 虽然这比仅仅改变属性稍微多一些,但在我看来,好处往往超过成本。
一个潜在的问题是,这个 model 在属性需要设置器的 WPF 中可能无法很好地工作。
对于使用System.Text.Json
更改 object 类型(主要用于简单 dtos)的快速解决方案:
public class Program
{
var orgList = new List<UserModel>()
{
new UserModel(){FirstName = "Jan"},
new UserModel(){FirstName = "Tom"},
new UserModel(){FirstName = "Alan"}
};
List<UserModel> TempUserModelList = new List<UserModel>();
foreach (var user in orgList)
{
var copyUser = JsonSerializer.Deserialize<UserModel>(JsonSerializer.Serialize(user));
TempUserModelList.Add(copyUser);
}
}
TempUserModelList
将包含一组新的复制用户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.