您做错的主要事情是您没有将结果分配回某事。这就是为什么您的原件似乎保留了所有客户。但是我们仍然可以在原来的基础上改进:
filteredClients = filteredClients.Where(n => !jobsToSearch.Any(j => j.Client == n.ClientId)).ToList();
这与您的.Count()
解决方案之间的区别在于.Any()
,一旦遇到第一个匹配项,就可以停止查看每个客户端的作业列表,因此它应该运行得更快一些。但我们还没有完成。通过将工作列表缩小到仅不同的客户,我们可以做得更好:
var badClients = jobsToSearch.Select(j => j.Client).Distinct().ToList();
filteredClients = filteredClients.Where(n => !badClients.Any(j => j == n.ClientId)).ToList();
使用HashSet可能会更好,它可以像字典一样进行 O(1) 查找。假设客户端 ID 是一个 int:
var badClients = new HashSet<int>(jobsToSearch.Select(j => j.Client));
filteredClients = filteredClients.Where(n => !badClients.Contains(n.ClientId)).ToList();
最后一个选项是否表现更好取决于有工作的客户数量......如果列表很短, .Distinct() 可能仍然会做得更好。
最后,我通常不建议.ToList()
这样打电话。尽可能将实际实现 List、Array 或集合类型保存到最后一刻,并尽可能长时间地将其保留为 Enumerable。