繁体   English   中英

从一个列表复制/编辑到另一个列表而不影响原始列表 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM