2013-05-19 34 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方法

相关问题