如果我更改了一个列表的数据,为什么其他列表也会更改?

时间:2016-09-07 06:04:18

标签: c# list

我有一个班级

var dst = ds.Tables[0].AsEnumerable()
                      .Select(s => new MatchAddress 
                       { 
                           Name = s.Field<String>("officename").Trim().ToLower(), 
                           Pincode = Convert.ToString(s.Field<double>("pincode")).Trim(), 
                           Taluka = s.Field<String>("Taluk").Trim(),
                           District = s.Field<String>("Districtname").Trim(), 
                           Rank = 0f 
                       })
                      .ToList();

我使用此类创建了新列表,如下所述

List<MatchAddress> lm;

我还初始化了新列表dst

现在我将lm列表分配给lm = dst ; foreach (MatchAddress ma in lm) { if (ma.Name == "xyz") { ma.Pincode = null; } } ,如下所示

Pincode

确保列表lm的属性null设置为lm,其中name =“XYZ”。

因此列表lm更新并将pincode字段设置为空。

但我的问题是为什么列表lm也会更新列表dst的结果。

dst列表还在列表dst中设置了pincode null。

我们将lm列表克隆到lm,那么为什么列出Date.parse会更改列表dst ??

我知道这背后的理由不是为什么会发生这种情况,如果你知道的话请现在就让我来。

我不想回答这个问题

2 个答案:

答案 0 :(得分:1)

List是引用类型数据。但如果你愿意,你可以制作克隆。这是

的简单扩展方法
static class Extensions
    {
        public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
        {
            return listToClone.Select(item => (T)item.Clone()).ToList();
        }
    }

答案 1 :(得分:0)

因为List是引用类型数据。 lm和dst都指向相同的数据。如果您希望两个列表都独立,则可以执行以下操作:

List<MatchAddress> lm = dst.ConvertAll(address => new MatchAddress(Name = address.Name, Pincode = address.Pincode, Taluka= address.Taluka, District = address.District, Rank = address.Rank));