2016-09-22 5 views
1

私は二つのリスト、オリジナルのものを持っていると1をコピーしたC、私は1つの理由により、元のリストのコピーを作った:変更は、元のリストを反映している - #

私は/作業データを処理する必要があります元のリストから編集するべきではありません!だから私は元のリストのコピーを作成して作業しました。でも、元のリストに反映されたコピーされたリストで何らかの変更が加えられました。ここで

が私のコードです:

forPrintKitchenOrders = new List<OrderTemp>(); 
foreach (var itemss in forPrintKitchen) 
{ 
    forPrintKitchenOrders.Add(itemss); // HERE I AM ADDING ITEMS TO ANOTHER LIST BECAUSE I DON'T WANT TO EDIT ORIGINAL LIST (Change quantity etc) 
} 

if (forPrintKitchen.Count > 0) 
{ 

    foreach (var item in forPrintKitchenOrders.ToList()) 
    { 
     foreach (var item2 in mainList) 
     { 
      if (item2.MainProductID == Convert.ToInt32(item._articleCode)) 
      { 
       //I don't know why this is happening. I loop another list (copy of original list, because I didn't want to harm original list), and when I find certain item I am reducing quantity (-1), 
       //And later I realized and saw while I was debugging, that the value of quantity in my original "forPrintKitchen" list is also edited, I don't know how changed reflected there.. 

       int calculate = Convert.ToInt32(item._quantity)-1; //this block is making me trouble, here I am reducing quantity and later that reflects to my forPrintKitchen list even if I am editing and looping //forPrintKitchenOrders(original's copy) 
       item._quantity = calculate.ToString(); 
      } 
     } 
    } 
    foreach (var items in forPrintKitchen) //THIS IS MY ORIGILAN LIST AND SHE SHOULD NOT BE EDITED WHEN I EDIT "forPrintKitchenOrders" item 
    { 
    //Original List 
     OrdersKitchen kitchen = new OrdersKitchen(); 
     kitchen.ProductID = Convert.ToInt32(items._articleCode); 
     kitchen.UserID = Util.User.UserID; 
     kitchen.UserName = Util.User.FirstName 
     kitchen.LastName = Util.User.LastName 
     kitchen.BillID = bill.BillID; 
     kitchen.Quantity = Convert.ToInt32(items._Quantity); 
     OrdersKitchen.Add(kitchen); 
    } 
    foreach (var itemss in mainList) 
    { 

     OrdersKitchen kitchen2 = new OrdersKitchen(); 
     kitchen2.ProductID = Convert.ToInt32(itemss.MainProductID); 
     kitchen2.UserID = User.UserID; 
     kitchen2.UserName = Util.User.FirstName; 
     kitchen2.LastName = Util.User.LastName; 
     kitchen2.BillID = bill.BillID; 
     kitchen2.Quantity = Convert.ToInt32(0); //HARDCODE ZERO 
     OrdersKitchen.Add(kitchen2); 
    } 
} 

mainList.Clear(); 
//forPrintKitchenOrders.Clear(); 
} 

EDIT: 私はあなたの回答を見て、AFTER GUYSは、私は@のサチンのポストを踏襲し、類似したコードを書いたので、このオールライトは何ですか? btwは今のところ働いているようです...しかし、私はこの解決策が大丈夫ですか?

foreach (var itemss in forPrintKitchenOrders) 
{ 
    forPrintKitchenOrders.Add(new OrderTemp(itemss._articleCode,itemss._name,itemss._quantity,itemss._amount)); 
} 

public class OrderTemp 
{ 
     public string _articleCode; 
     public string _name; 
     public string _quantity; 
     public double _amount; 

     public OrderTemp(string articleCode, string name, string quantity, double amount) 
     { 
      _articleCode = amount; 
      _name = name; 
      _quantity = quantity; 
      _amount = amount; 
     } 
} 
+4

これらは同じオブジェクトを参照する2つのリストです。古い**セット**の同じオブジェクトを参照する新しい**セット**を作成します。最初のオブジェクトのプロパティを変更した場合は、2番目のオブジェクトのプロパティが変更されます。これは、使用しているオブジェクトが参照型であり、値型ではないためです。 – user3185569

+1

ここをクリックしてください:http://stackoverflow.com/q/14007405/1136211 – Clemens

+0

@ user3185569は最初の投稿にコメントしているので、オブジェクトをあるリストから別のリストにコピーしているわけではありません。あなたはTHE REFERENCEに対処しています。あなたは 'forPrintKitchenOrders.Add(itemss);' for'PrintKitchenOrders.Add(itemss)を変更する必要があります。クローン()); ' – Rumpelstinsk

答えて

1

あなたは「コピー一覧は」実際にコピーないように言及されているコレクション。

オリジナルのコレクションと同じオブジェクトを参照して、コレクション内の要素はです。

あなたはこのようなものを使用してコピーforeachループを交換する必要があります。

foreach (var item in forPrintKitchen) 
{ 
    forPrintKitchenOrders.Add(item.Clone()); // The clone method should return a new Instance after copying properties from item. 
} 

Clone方法はnewインスタンスを作成して、インスタンスからの各プロパティをコピーしてクローンされ、その後、新しく作成されたインスタンスを返す必要があります。

基本的には、このような(名前は関係ありません)クローンという名前のメソッドを定義OrderTempでクラスにあります:あなたはbasicaly 浅いコピーを作成

public class OrderTemp 
{ 
    /* other members of the class */ 
    public OrderTemp Clone() 
    { 
     return new OrderTemp 
     { 
      property1 = this.property1; 
      property2 = this.property2; 
      /* and so on */ 
     }; 
    } 
} 
+0

あなたの記事をフォローすることで、私が見つけた質問と投稿のソリューションを編集しますが、正しい方法はわかりません。だからあなたは見てみることができます –

+0

私に答えることができますか? –

+0

はい、それもうまくいくはずです。 – sachin

0

。これは、参照やジェネリック型のようなすべての単純な型をコピーしますが、ではなくオブジェクトの内容をコピーすることを意味します。あなたがオブジェクトをば完全にコピーする必要が解決策として

foreach (var itemss in forPrintKitchen) 
{ 
    forPrintKitchenOrders.Add(new OrderTemp(){ /*copy itemss here*/ }); 
} 

私はこの作業のためにAutoMapperを使用するのが大好き、しかし、あなたはあなたの中にフレームワークを取るしたくない場合は、あなただけのIClonableを実装することができますプロジェクトOrderTempタイプとすべての必要なネストされたタイプで、Clone()メソッドを呼び出します。

0

リストのコピーを作成しましたが、コピーには同じオブジェクトへの参照が含まれています。オブジェクト自体はコピーされません。

関連する問題