C# 为什么更改linq组中的一个项目会影响同一组中的其他项目?
我正在编写类似的C#代码: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
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;
}