2013-05-19 67 views
2

我的工作類似這樣的一些C#代碼:爲什麼更改linq組中的一個項目會影響同一組中的其他項目?

public class Item 
{ 
    public bool flag { get; set; } 
    public string itemName { get; private set;}; 

    Item(string _name) 
    { 
     this.itemName = _name; 
     this.flag  = false; 
    } 
} 

public class MainClass 
{ 
    public static void Main() 
    { 
     List itemList = new List<Item>(); 
     itemList.Add(new Item("ProductA"); 
     itemList.Add(new Item("ProductA"); 
     itemList.Add(new Item("ProductB"); 

     var itemGroups = from item in itemList group item by item.itemName; 
     foreach (var itemGroup in itemGroups) 
     { 
      foreach (Item i in itemGroup) 
      { 
       i.flag = true; 
       break; 
      } 
     } 
    } 
} 

我想在這裏實現是改變一個組中只有一個項目,而不在同一個組接觸其他物品。從上面的代碼中,我期望只有itemName爲「ProductA」的第一個項目的標誌設置爲true。但結果是兩個項目(帶有itemName「ProductA」)的標誌都被設置爲true。

我是新來的linq。我做錯了什麼?或者我怎樣才能在這裏實現目標?

非常感謝!

道格

+0

您有兩個同名的項目。 'ProductA' – Saravanan

+2

'但結果是這兩個項目(帶有itemName「ProductA」)的標誌都設置爲true'再次調試您的代碼。它按照你的預期工作。 – I4V

+1

你確定*這是你的實際代碼嗎?您是否確定*您沒有添加兩次相同的項目參考,因此實際上您只有1個產品A,但是同一個產品列出了兩次?意思是說,你可以在上面的代碼中重現問題,還是代碼在這個問題上被忽略了? –

回答

1

我無法重現您的方案,因爲它有每個項目是唯一Item類型。可能在你的代碼,你可能會意外地在任何時間稍後加入了一個項目兩次到您的列表喜歡

Item item1 = new Item("ProductA"); 
listItem.Add(item1); 
.... 
listItem.Add(item1); 

在這種情況下,如果你是「產品A」,那麼這種變化與ITEMNAME更新項目將反映在清單的兩個要素中。請檢查這個案例。

+0

謝謝你們!這是我的壞事。我做了兩次相同的實例。樣本應該按預期工作。 – user2398653

+0

然後我建議你接受這個答案給你的問題,很高興你的工作:)另外,考慮下載[LINQPad](http://linqpad.net)並在發佈前嘗試你的代碼,它會使它更容易無論你和其他人來幫助你。 –

0

我想在這裏實現的是隻更改組 中的一個項目,而不觸及同一組中的其他項目。從上面的代碼中,我是 ,希望只有itemName爲「ProductA」的第一個項目的標誌 設置爲true。

你的代碼是好的,檢查調試器:

//ProductA 
itemGroups.ToList()[0].ToList()[0].flag //true 
itemGroups.ToList()[0].ToList()[1].flag //false 

//ProductB 
itemGroups.ToList()[1].ToList()[0].flag //true 
0

你的代碼枚舉組中的所有項目。

 foreach (Item i in itemGroup) 
     { 
      i.flag = true; 
      break; 
     } 

您需要獲得第一個。使用First或FirstOrDefault方法

相關問題