【问题标题】:Why the other list also changes if I have changed the data of one list? [duplicate]如果我更改了一个列表的数据,为什么另一个列表也会更改? [复制]
【发布时间】:2017-01-14 16:38:08
【问题描述】:

我有一节课

class MatchAddress
{
    public string Name { get; set; }
    public string Taluka { get; set; }
    public string District { get; set; }
    public string Pincode { get; set; }
    public float Rank { get; set; }
}

我已经使用下面提到的这个类创建了新列表

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&lt;MatchAddress&gt; lm;

现在我将dst 列表分配给lm,如下所示

lm = dst ;


foreach (MatchAddress ma in lm)
{                       
    if (ma.Name == "xyz")
    {                              
        ma.Pincode = null;
    }
}

在此之后确保列表lm 的属性Pincode 设置为null 其中name = "XYZ"。

因此列表lm 被更新并设置密码字段为空。

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

lm列表也将dst列表中的pincode设置为空。

我们将dst 列表克隆为lm 那么为什么列表lm 更改也列表dst ??

我知道这背后的原因,而不是为什么会发生这种情况,如果您知道,请现在告诉我。

我不想回答这个问题

【问题讨论】:

  • 您不是在克隆dst,而是将dst 列表分配给通过引用分配的lm 列表,这就是两个列表都发生变化的原因。

标签: c# list


【解决方案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();
        }
    }

【讨论】:

    【解决方案2】:

    因为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));
    

    【讨论】:

    • 这个问题已经在这里被问过几千次了,不用再回答了
    • @ADMIN 有用吗?
    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多