2017-04-06 7 views
0

更新データのすべての私のデータ

  1. 元のリスト(fooList)余分な情報(fooWithExtList)が含まれてい
  2. リスト

しかし、別のリストにテキストを連結すると、元のリストの情報も更新される理由がわかりません。

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

+0

あなたは同じ_reference_を使用しているため、3つのリストがすべてthを指しています同じデータ。参照型と値型の違いを理解する必要があります。 – Steve

+0

[C#の概念:値と参照の種類]のようなもの(http://www.albahari.com/valuevsreftypes.aspx) – Steve

答えて

1

あなたは、あなたがそれらを別々のエンティティとして存在する場合は、最初にリストに追加のFooクラスの別のインスタンスを作成する必要があります。それ以外の場合は、3つのリストの同じインスタンスへの参照を追加するため、Fooインスタンスの1つに加えられた変更が3つのリストに反映されます。

可能な解決策。あなたのFooクラスは、Copyメソッドを持っていると仮定し....上記のコメントで指摘したように、あなたが

//assign copies of foodata to fooList 
fooDataList.ForEach(fdl => fooList.Add(fdl.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; 
    } 
} 

は今、良い読みが
C# Concepts: Value vs Reference Types
MSDN documentation
Or on this same site from Jon Skeetです

関連する問題