在List<;T>;.AddRange可有条件地将元素从一个列表添加到另一个列表

本文关键字:列表 添加 另一个 一个 gt lt List AddRange 有条件 元素 | 更新日期: 2023-09-27 18:11:58

我有一个List<String>和两个List<CustomObject>
我想合并两个List<CustomObject>,但前提是第二个List<CustomObject>属性不包含在List<String>中。

所以,想做这样的事情:

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

我在这里错过了什么?

在List<;T>;.AddRange可有条件地将元素从一个列表添加到另一个列表

本应使用Where,但您却滥用了Select

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

CCD_ 8是一种投影方法。它采用一个序列并选择它,有时选择整个项目、单个属性,或者将其完全投影到其他内容中。

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

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


没有解决手头的具体错误,这里有一些额外的想法需要考虑。

在这种情况下,HashSet<string>可能对names有利,特别是在names非常大的情况下。HashSet<T>上的Contains的复杂度为O(1(,而List<T>的复杂度则为O(n(。然而,HashSet有相关的开销,所以如果您有任何顾虑,最好同时测量两者,看看哪一个更具性能。

还有一件可能会有所帮助的事情,如果您只需要一个序列接一个地流式传输,并且不一定需要更改或添加到任何一个集合,那么您可以考虑使用UnionConcat操作。

var sequence = resultSet1.Union(resultSet2.Where(x => !names.Contains(x.City)));
var sequence = resultSet1.Concat(resultSet2.Where(x => !names.Contains(x.City)));

两者的区别在于,Union将过滤掉结果序列中的任何重复(来自两个输入,而不仅仅是第二个对第一个(,Concat不应用重复过滤逻辑,只是一个序列接一个序列地进行流式传输。输入序列(resultSet1resultSet2(是未修改的。