为什么更改linq组中的一个项目会影响同一组中的其他项目?

时间:2013-05-19 11:49:31

标签: c# linq

我正在研究一些类似的C#代码:

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的新手。我做错了吗?或者我如何在这里实现目标?

非常感谢!!!

道格

3 个答案:

答案 0 :(得分:1)

我无法重现您的方案,因为每个项目都是Item类型的唯一项目。可能在您的代码中,您可能不小心将项目两次添加到列表中,如

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

在这种情况下,在任何以后的时间点,如果您使用itemname更新项目为“ProductA”,那么该更改将反映在列表的两个元素中。请检查此案例。

答案 1 :(得分:0)

  

我想在这里实现的是只更改组中的一个项目   不接触同一组中的其他项目。从上面的代码,我   期望只有itemName“ProductA”的第1项具有其标志   设置为true。

您的代码没问题,请检查调试器:

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

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

答案 2 :(得分:0)

您的代码枚举组中的所有项目。

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

你需要得到第一个。使用First或FirstOrDefault方法