我正在尝试编写一个函数,它将有两个列表:
但不确定为什么当我在另一个列表中连接文本时,它还会更新我原始列表中的信息。
以下是代码:
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
答案 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