确定一个列表中哪些元素不在另一个列表中

3
我有两个 IList<CustomObject>,其中 CustomObject 有一个 Name 属性,该属性是一个 string。将第一个称为 set,第二个称为 subsetset 包含我刚在多选列表框中向用户显示的一些东西。用户选择的已经放入了 subset(因此保证 subsetset 的子集,因此有了聪明的名称 ;))

从这两个集合中生成第三个 IList<CustomObject> inverseSubset,其中包含用户没有选择的所有 CustomObjects,最直接的方法是什么?

我一直在尝试使用 LINQ 这样的东西:

IEnumerable<CustomObject> inverseSubset = set.Select<CustomObject,CustomObject>(
    sp => !subset.ConvertAll<string>(p => p.Name).Contains(sp.Name));

目前根据类似问题的答案进行尝试,但是到目前为止,甚至没有编译成功,更不用说运行了 :P

2个回答

7
使用LINQ的Except方法:Except

生成两个序列之间的差值集合。


他需要实现 IEquatable<T> 泛型接口并为 CustomObject 提供自己的 GetHashCodeEquals 方法。 - Tim Schmelter
1
实际上,由于两个集合都包含对相同对象的引用,所以我没有问题。IEnumerable<CustomObject> inverseSubset = set.Except<CustomObject>(subset); 运行得很好。 - Chuck Wilbur

-1

啊哈,最近 SQL 太多了 - 我不想要 Select,我想要的是 Where

List<string> subsetNames = subset.ConvertAll<string>(p => p.Name);
IEnumerable<CustomObject> inverseSubset =
    set.Where<CustomObject>(p => !subsetNames.Contains(p.Name));

好的,它不像“Except”那样流畅,但为什么要投反对票呢?如果我实际上只需要过滤Name属性,我认为“Except”不能胜任,对吧? - Chuck Wilbur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接