如何按其他列表过滤列表

时间:2017-05-22 13:43:08

标签: c# list linq

我有两个清单:

List<myObject> mainList;

List<myObject> blackList;

我正在尝试按条件和另一个条件创建一个新列表,这些元素不应该在黑名单中。 这是我的尝试:

List<myObject> newList = mainList.Where(x => x.Id == 5 && !blackList.Contains(x)).ToList();

这个newList是在一个循环中生成的,在循环的第一轮中,blackList为空并且它有效,在第二轮blackList包含大约200k个元素。当上面的线路工作时,它不会移动,它会在那里停留几分钟。如何更有效地过滤,以便我不会获得blackList中的元素?感谢。

1 个答案:

答案 0 :(得分:3)

您面临的问题是List<T>实施Contains的方式 - 它会线性搜索,对于长列表而言,这是非常缓慢且低效的。

为了获得更好的性能,您可以为黑名单使用更好的结构 - 对于像HashSet<T>

这样的长列表,可以使用更快/更好的实现
var blackList = new HashSet<myObject>(theBlackList);