我正在为一组员工创建过滤器。为了做到这一点,我最初获取所有员工的原始集合。我克隆了这个列表,所以我可以迭代原始列表,但从第二个列表中删除项目。
对于我拥有的每个过滤器,我构建了一组通过过滤器的员工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()中匹配由于
答案 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函数直接对其进行过滤?
如果我做了令人眼花缭乱的事情,请有人告诉我!!