C# 在列表内部使用Linq查询<;T>;。AddRange可有条件地将元素从一个列表添加到另一个列表

C# 在列表内部使用Linq查询<;T>;。AddRange可有条件地将元素从一个列表添加到另一个列表,c#,linq,C#,Linq,我有一个列表和两个列表 我想合并两个列表,但前提是列表中不包含第二个列表属性 所以,我想做一些类似的事情: resultSet1.AddRange(resultSet2.Select(x => !names.Contains(x.City)).ToList()); 我在这里遗漏了什么?当您应该使用Where时,您误用了选择 resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City)); Select是一种投影

我有一个
列表
和两个
列表

我想合并两个
列表
,但前提是
列表
中不包含第二个
列表
属性

所以,我想做一些类似的事情:

resultSet1.AddRange(resultSet2.Select(x => !names.Contains(x.City)).ToList());

我在这里遗漏了什么?

当您应该使用
Where
时,您误用了
选择

resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City));
Select
是一种投影方法。它获取一个序列并选择它,有时选择整个项目、单个属性,或者将其完全投影到其他项目中

其中
是一种过滤方法。它接受一个序列并对其应用谓词,只生成传递谓词的元素

(在您的示例中,通过使用
Select
,您实际上是在尝试将
bool
列表添加到
CustomObject
列表中,这是行不通的。)


不解决手边的具体错误,这里有一些额外的想法要考虑。< /P> 在这种情况下,

HashSet
可能有利于
名称
,特别是当
名称
非常大时<代码>包含
散列集上的
的复杂性为O(1),而
列表的复杂性为O(n)。然而,HashSet有相关的开销,所以如果您有任何顾虑,最好对两者进行度量,看看哪个性能更好

另一个可能有帮助的东西,如果你只需要一个流一个接一个,并且不一定需要改变或添加到任何一个集合,你可以考虑使用<代码>联合< /COD>或<代码> CONTAAT/<代码>操作。p>

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