加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在List.AddRange中使用Linq查询有条件地将元素从一个列表

发布时间:2020-12-15 18:21:24 所属栏目:百科 来源:网络整理
导读:我有一个List String和两个List CustomObject. 我想结合两个List CustomObject但仅限于第二个List CustomObject属性不包含在List String中. 所以,想要做这样的事情: resultSet1.AddRange(resultSet2.Select(x = !names.Contains(x.City)).ToList()); 我在这
我有一个List< String>和两个List< CustomObject>.
我想结合两个List< CustomObject>但仅限于第二个List< CustomObject>属性不包含在List< String>中.

所以,想要做这样的事情:

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

我在这里错过了什么?

解决方法

当你应该使用Where时,你会误用Select.
resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City));

选择是一种投影方法.它需要一个序列并选择它,有时选择整个项目,单个属性,或将其完全投射到其他东西.

过滤方法在哪里.它接受一个序列并对其应用谓词,只产生传递谓词的元素.

(在您的示例中,通过使用Select,您有效地尝试将一个bool列表添加到CustomObject列表中,这不会起作用.)

不解决手头的具体错误,这里有一些需要考虑的其他想法.

这是HashSet< string>的情况.可能对名称有益,特别是如果名称非常大.包含在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)未经修改.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读