为什么RemoveAll(x => x.Condition)会删除所有记录?

时间:2015-08-12 09:49:31

标签: c# .net linq

我正在为一组员工创建过滤器。为了做到这一点,我最初获取所有员工的原始集合。我克隆了这个列表,所以我可以迭代原始列表,但从第二个列表中删除项目。

对于我拥有的每个过滤器,我构建了一组通过过滤器的员工ID。完成所有过滤后,我会尝试删除克隆列表中任何这些列表中未包含的所有内容。

但是出于某种原因,每当我尝试使用.RemoveAll()进行此操作时,所有记录似乎都被删除了,我无法弄清楚原因。

以下是我使用的方法的精简版,仅应用了1个过滤器:

public List<int> GetFilteredEmployeeIds(int? brandId)
{

    List<int> employeeIds = GetFilteredEmployeeIdsBySearchTerm();

    List<int> filteredEmployeeIds = employeeIds.Clone();

    // Now filter the results based on which checkboxes are ticked
    foreach (var employeeId in employeeIds)
    {
        // 3rd party API used to get values - please ignore for this example
        Member m = new Member(employeeId);

        if (m.IsInGroup("Employees"))
        {
            int memberBrandId = Convert.ToInt32(m.getProperty("brandID").Value);

            // Filter by brand
            List<int> filteredEmployeeIdsByBrand = new List<int>();

            if (brandId != null)
            {
                if (brandId == memberBrandId)
                    filteredEmployeeIdsByBrand.Add(m.Id);

                var setToRemove = new HashSet<int>(filteredEmployeeIdsByBrand);
                filteredEmployeeIds.RemoveAll(x => !setToRemove.Contains(x));
            }
        }
    }

    return filteredEmployeeIds;
}

正如您所看到的,我基本上试图从克隆的记录集中删除所有记录,只要id在第二个集合中不匹配。但是由于某些原因,每个记录似乎都被删除了。

有人知道为什么吗?

PS:只是为了澄清,我已经在整个过程中记录了检查值,并且第二个列表中出现了记录,但无论出于何种原因,它们都没有在RemoveAll()中匹配

由于

2 个答案:

答案 0 :(得分:2)

确定发布后几分钟我意识到我做错了什么:范围不正确。 应该的内容是这样的:

public List<int> GetFilteredEmployeeIds(int? brandId)
        {
            List<int> employeeIds = GetFilteredEmployeeIdsBySearchTerm();

            List<int> filteredEmployeeIds = employeeIds.Clone();
            List<int> filteredEmployeeIdsByBrand = new List<int>();

            // Now filter the results based on which checkboxes are ticked
            foreach (var employeeId in employeeIds)
            {
                Member m = new Member(employeeId);

                if (m.IsInGroup("Employees"))
                {
                    int memberBrandId = Convert.ToInt32(m.getProperty("brandID").Value);

                    // Filter by brand
                    if (brandId != null)
                    {
                        if (brandId == memberBrandId)
                            filteredEmployeeIdsByBrand.Add(m.Id);
                    }
                }
            }

            var setToRemove = new HashSet<int>(filteredEmployeeIdsByBrand);
            filteredEmployeeIds.RemoveAll(x => !setToRemove.Contains(x));

            return filteredEmployeeIds;
        }

基本上,需要在外部员工ID的循环中删除条目: - )

答案 1 :(得分:0)

我知道你说你的例子被剥夺了,所以也许这不合适,但你可以做以下的事情:

    public List<int> GetFilteredEmployeeIds(int? brandId)
    {
        List<int> employeeIds = GetFilteredEmployeeIdsBySearchTerm();
        return employeeIds.Where(e => MemberIsEmployeeWithBrand(e, brandId)).ToList();
    }

    private bool MemberIsEmployeeWithBrand(int employeeId, int? brandId)
    {
        Member m = new Member(employeeId);

        if (!m.IsInGroup("Employees"))
        {
            return false;
        }

        int memberBrandId = Convert.ToInt32(m.getProperty("brandID").Value);
        return brandId == memberBrandId;
    }

我刚刚完成了这项工作,没有经过测试,但如果你需要做的只是过滤员工ID,那么也许你不需要克隆原始列表,只是使用Where函数直接对其进行过滤?

如果我做了令人眼花缭乱的事情,请有人告诉我!!