我的代码存在一些问题并设置了谓词语句。 C#不是我学习编写的主要语言,而lambda语句并不是我完全熟悉的。
这是我需要运行的示例,代码按预期工作,但是我认为最好使用RemoveAll方法而不是foreach-> while-> if我有的循环
为了后人,这里是“工作”功能。目前被用作包装函数。
private void UnassignHelper(ThingDbFactory thingFactory,
IEnumerable<Thing> assignedThings, string groupName)
{
foreach(var thing in assignedThings)
while(thing.ThingGroups.Contains(groupName))
{
if(thing.ThingGroups.Remove(groupName))
{
thingFactory.Save(thing);
}
}
}
这完全是丑陋的,这个代码金字塔完全符合预期。有人问我是使用RemoveAll()代替,但问题是我目前测试的方法不起作用。
item.ItemGroups.RemoveAll(i => item.ItemGroups.Contains(itemGroupName));
经过测试,该方法已删除了我的所有ItemGroup分配,而不仅仅删除了我需要删除的ItemGroup分配。
item.ItemGroups.RemoveAll(i => item.ItemGroups == itemGroupName);
无效,因为我无法比较System.Collections.Generic.List和string。
item.ItemGroups.RemoveAll(i => item.ItemGroups.Equals(itemGroupName));
是有效代码,但在运行代码时它不会执行任何操作。
对于进一步的文档,我想要比较的不是关键,而是值itemGroupName
,这里是关注问题的项目的结构。
{
"_id" : 1,
"Name" : "Banana",
"ItemGroups" : [
"Not the group to remove",
"The duplicated group to remove",
"The duplicated group to remove",
"The duplicated group to remove"
],
}
其中,在通过Visual Studio进行调试时,实际项目将如此反映(使用模拟手表放置手表时的结构):
item
----ItemGroups
--------[0]["not the group to remove"]
--------[1]["the duplicate group to remove"]
--------[2]["the duplicate group to remove"]
--------[3]["the duplicate group to remove"]
如果不使用foreach-&gt; while-&gt; if循环,如何更好地构建代码的任何建议都将受到赞赏。
答案 0 :(得分:3)
RemoveAll
中的谓词应该确定是否应删除特定项目。这就是你在lambda中将项目作为输入参数i
的原因。
这应该可以完成您正在寻找的工作:
item.ItemGroups.RemoveAll(i => i == groupName);
i
是输入,在这种情况下是ItemGroups
列表中的每个项目。如果应删除该项,则lambda应返回true。 i == groupName
检查输入是否与您要查找的groupName匹配。