选择不是另一个对象属性的字符串

4
我正在编写代码,从数组ApiIds中选择不是结果对象属性ApiId的字符串键。
我编写了以下代码,但它看起来很冗余,有没有一种方法将其合并为一个语句,而不将对象的HashSet转换为另一个字符串的HashSet?
        var resultsCached = new HashSet<string>(results.Select(x => x.ApiId));
        var missingResults = apiIds.Select(x => !resultsCached.Contains(x));

感谢。

4
我认为这种方式很合理。你为什么想要改变它? - Selman Genç
短并不一定更好...特别是在缩短代码背后的任何魔法不被充分理解的情况下..(不仅是原始作者,还包括以后阅读和维护该代码的任何人)..一个例子是,根据Ilya所说的“而不是将对象的HashSet转换为另一个字符串的HashSet?”使用下面的Except答案可能或可能不合适。 - Vikas Gupta
2个回答

8
< p > Except会返回不在另一个集合中的项:

var missingResults = apiIds.Except(results.Select(x => x.ApiId));

1
另一个高效的O(n)方法是使用HashSet.ExceptWith,它会从集合中移除所有在第二个序列中出现的元素:
HashSet<string> apiIdSet = new HashSet<string>(apiIds);
apiIdSet.ExceptWith(results.Select(x => x.ApiId));  

该集合仅包含当前不在results中的字符串。

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