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
)