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

C# 为什么更改linq组中的一个项目会影响同一组中的其他项目?,c#,linq,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 st

我正在编写类似的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;
            }
        }
    }
 }
        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
公共类项目
{
公共布尔标志{get;set;}
公共字符串itemName{get;private set;};
项目(字符串_名称)
{
this.itemName=\u name;
this.flag=false;
}
}
公共类主类
{
公共静态void Main()
{
List itemList=新列表();
项目列表。添加(新项目(“产品A”);
项目列表。添加(新项目(“产品A”);
项目列表。添加(新项目(“产品B”);
var itemGroups=从itemList组中的项按项分组。itemName;
foreach(itemGroups中的var itemGroup)
{
foreach(项目组中的项目i)
{
i、 flag=true;
打破
}
}
}
}
我想在这里实现的是只更改组中的一个项,而不接触同一组中的其他项。从上面的代码中,我希望只有itemName为“ProductA”的第一个项的标志设置为true。但结果是这两个项(itemName为“ProductA”)的标志都设置为true

        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
我是linq的新手。我做错了什么吗?或者我如何在这里实现目标

        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
非常感谢

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

道格

我无法重现您的场景,因为它的每个项目都是唯一的
项目
。可能是在您的代码中,您可能意外地在列表中添加了一个项目两次,如

Item item1 = new Item("ProductA");
listItem.Add(item1);
....
listItem.Add(item1);
        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
在本例中,在以后的任何时间点,如果您使用itemname作为“ProductA”更新了项目,则该更改将反映在列表的两个元素中。请检查本例

        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
我想在这里实现的是只更改组中的一项 不接触同一组中的其他项目。根据以上代码,我 期望只有itemName为“ProductA”的第一个项具有其标志 设置为true

        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }
代码正常,请签入调试器:

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

//ProductB
itemGroups.ToList()[1].ToList()[0].flag //true
        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }

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

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

您需要获取第一个。使用First或FirstOrDefault方法

您有两个同名的项。
ProductA
,但结果是两个项(itemName为“ProductA”)将其标志设置为true
再次调试代码。它的工作方式与您预期的一样。您确定这是您的实际代码吗?您确定没有两次添加相同的项目引用,因此实际上您只有1个产品A,但相同的产品A列出了两次?这意味着,您可以在上述代码中重现问题,还是将代码简化对于这个问题?谢谢各位!这是我的错。我确实添加了相同的实例两次。样本应该按预期的方式工作。然后我建议你接受你的问题的答案,很高兴你解决了这个问题。)同时,考虑下载并在发布之前尝试你的代码,这将使你和他人都更容易地帮助你。
        foreach (Item i in itemGroup)
        {
            i.flag = true;
            break;
        }