更新另一个列表中的数据会更改所有数据

时间:2017-04-06 18:01:05

标签: c# linq list

我正在尝试编写一个函数,它将有两个列表:

  1. 原始列表(fooList)
  2. 包含额外信息的列表(fooWithExtList)
  3. 但不确定为什么当我在另一个列表中连接文本时,它还会更新我原始列表中的信息。

    以下是代码:

        var fooDataList = new List<Foo>();
        fooDataList.Add(new Foo { Bar = "Test1" });
        fooDataList.Add(new Foo { Bar = "Test2" });
        fooDataList.Add(new Foo { Bar = "Test3" });
        fooDataList.Add(new Foo { Bar = "Test4" });
    
        var fooList = new List<Foo>();
        var fooWithExtList = new List<Foo>();
    
        //assign foodata to fooList
        fooDataList.ForEach(fdl => fooList.Add(fdl));
    
        //assign foodata to fooWithExtList
        fooDataList.ForEach(fdl => fooWithExtList.Add(fdl));
    
        //set the fooWithExtList with extra info
        fooWithExtList.ForEach(fwel => fwel.Bar = fwel.Bar + "ext");
    
        //merge the list
        fooList = fooList.Concat(fooWithExtList).ToList();
    

    结果:

      

    Test1ext Test2ext Test3ext Test4ext Test1ext Test2ext Test3ext Test4ext

    期待:

      

    Test1 Test2 Test3 Test4 Test1ext Test2ext Test3ext Test4ext

    点网小提琴:https://dotnetfiddle.net/0nMTmX

1 个答案:

答案 0 :(得分:1)

如果希望将它们作为单独的实体存在,则需要创建添加到第一个列表的Foo类的不同实例。否则,您将引用添加到三个列表中的同一实例,因此,对其中一个Foo实例所做的更改将反映在三个列表中。

可能的解决方案。假设你的Foo类有一个Copy方法....

public class Foo
{
    public string Bar {get;set;}
    public Foo(string bar)
    {
        Bar = bar;
    }
    public Foo Copy()
    {
        Foo aCopy = new Foo(this.Bar);
        return aCopy;
    }
}

现在你可以写

//assign copies of foodata to fooList
fooDataList.ForEach(fdl => fooList.Add(fdl.Copy()));

正如上面的评论所指出的,良好的读数是正确的 C# Concepts: Value vs Reference Types
MSDN documentation
Or on this same site from Jon Skeet