我有一个List<String>
和两个List<CustomObject>
我想合并两个List<CustomObject>
,但前提是List<CustomObject>
中不包含第二个List<String>
属性。
所以,想做这样的事情:
resultSet1.AddRange(resultSet2.Select(x => !names.Contains(x.City)).ToList());
我在这里缺少什么?
答案 0 :(得分:13)
您应该使用Select
时误导Where
。
resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City));
Select
是一种投影方法。它需要一个序列并选择它,有时选择整个项目,单个属性,或将其完全投射到其他东西。
Where
是一种过滤方法。它接受一个序列并对其应用谓词,只产生传递谓词的元素。
(在您的示例中,使用Select
,您有效地尝试将bool
列表添加到CustomObject
的列表中,但这不会起作用。)< / p>
不解决手头的具体错误,这里有一些需要考虑的其他想法。
这种情况HashSet<string>
可能对names
有益,特别是names
非常大的情况。 Contains
上的HashSet<T>
具有O(1)复杂度,而List<T>
则为O(n)。但是,HashSet会产生开销,因此如果您有任何疑虑,最好同时测量两者并查看哪个更高效。
还有一件事可能会有所帮助,如果您只需要将一个序列流式传输到另一个序列之后并且不一定需要更改或添加到任一集合,您可以考虑使用Union
或Concat
个操作。
var sequence = resultSet1.Union(resultSet2.Where(x => !names.Contains(x.City)));
var sequence = resultSet1.Concat(resultSet2.Where(x => !names.Contains(x.City)));
两者的区别在于Union
将过滤掉结果序列中的任何重复项(来自两个输入,而不仅仅是第二个与第一个相对),Concat
不应用重复过滤逻辑和简单地将一个序列流到另一个序列。输入序列(resultSet1
和resultSet2
)未经修改。