2016-09-22 50 views
1

我有兩份名單,原來並複製一個,我做原單的複印件,因爲一個原因:「複製」列表所做的更改反映原始列表 - C#

我需要處理/工作數據從原始列表,但我不應該編輯原始列表!所以我創建了該原始列表的副本。但不知怎的,我在我的原始列表中反映了我在複製列表中做的更改。

這裏是我的代碼:

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(); 
} 

編輯: 此後,我看見您的答覆GUYS我跟着@薩欽的帖子,寫類似的代碼,所以這是還好吧?順便說一句,它現在看起來像它的工作......但我不確定這個解決方案好嗎?

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

這些是引用相同對象的兩個列表。你創建一個新的**集**,它引用舊**集**的相同對象。如果你改變了第一個對象的屬性,那麼它在第二個被改變。這是因爲你使用的對象是引用類型而不是值類型。 – user3185569

+1

請參閱:http://stackoverflow.com/q/14007405/1136211 – Clemens

+0

由於@ user3185569對第一篇文章發表評論,您不會將對象從一個列表應用到另一個列表。您正在處理參考。喲必須改變'forPrintKitchenOrders.Add(itemss);'to'forPrintKitchenOrders.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實例和複製每個從實例的屬性被克隆,然後返回新創建的實例。

基本上你將不得不定義一個名爲Clone方法(名稱並不重要)OrderTemp類是這樣的:

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

您basicaly創建副本。這意味着它將複製所有簡單類型,如引用和泛型類型,但不會對對象內容進行不對

至於解決方案,你需要完全以複製您的對象:

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

我喜歡使用AutoMapper此任務,但如果你不希望採取框架,你的項目,你可以只實現IClonable在您的OrderTemp類型和所有必需的嵌套類型和呼叫克隆()方法。

0

您製作了該列表的副本,但該副本仍包含對相同對象的引用;對象本身不被複制。