C#,RemoveAll的问题只删除了特定的索引

时间:2016-06-02 14:31:40

标签: c# lambda predicate

我的代码存在一些问题并设置了谓词语句。 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循环,如何更好地构建代码的任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

RemoveAll中的谓词应该确定是否应删除特定项目。这就是你在lambda中将项目作为输入参数i的原因。

这应该可以完成您正在寻找的工作:

item.ItemGroups.RemoveAll(i => i == groupName);

i是输入,在这种情况下是ItemGroups列表中的每个项目。如果应删除该项,则lambda应返回true。 i == groupName检查输入是否与您要查找的groupName匹配。