在c#中制作记录列表的深层副本的简便方法?

时间:2016-02-19 01:11:36

标签: c#

我想制作一份记录清单。下面的代码只复制记录的引用,因此更改myRecs1中的数据也会在MyRecs2中更改它。除了在循环中执行循环之外,还有一种从myRecs1获取myRecs2的完整副本的简单方法吗?

    static void Main(string[] args)
    {
        List<MyRec> myRecs1 = new List<MyRec>()
        {
            new MyRec() {Id = 1, Data = "001"},
            new MyRec() {Id = 2, Data = "002"},
            new MyRec() {Id = 3, Data = "003"}
        };

        //List<MyRec> myRecs2 = myRecs1.ToList(); // does not work of course

        // ugly but works
        List<MyRec> myRecs2 = myRecs1.Select(rec => new MyRec()
        {
            Id = rec.Id,
            Data = rec.Data
        }).ToList();

        myRecs1[2].Data = "xxx";


        foreach (var rec in myRecs2)
        {
            Console.WriteLine(rec.Data);
        }
    }

    public class MyRec
    {
        public int Id { get; set; }
        public string Data { get; set; }
    }
  • 编辑以显示我不喜欢的工作示例

1 个答案:

答案 0 :(得分:1)

这对你有用吗?

 List<MyRec> myRecs1 = new List<MyRec>()
        {
            new MyRec() {Id = 1, Data = "001"},
            new MyRec() {Id = 2, Data = "002"},
            new MyRec() {Id = 3, Data = "003"}
        };

List<MyRec> myRecs2 = JsonConvert.DeserializeObject<List<MyRec>>(
                                                JsonConvert.SerializeObject(myRecs1));

这样,你基本上将整个循环/嵌套/数据类型处理等推迟到一个框架..你也可以去二进制,xml或其他序列化..但它们通常比JSON有更多的约束对我来说很好,很多时候。