2014-11-03 75 views
4

我正在编写将从数组中选择字符串键的代码ApiIds不属于结果对象的属性ApiId。选择不属于另一个对象属性的字符串

我写了下面的代码,但它看起来对我来说是多余的,有没有办法将它合并成一个语句,而不是将对象的HashSet转换为另一个字符串HashSet?

 var resultsCached = new HashSet<string>(results.Select(x => x.ApiId)); 
     var missingResults = apiIds.Select(x => !resultsCached.Contains(x)); 

谢谢。

+4

这种方式对我来说看起来很合理。你为什么要改变它? – 2014-11-03 21:52:09

+0

更短不一定更好...尤其是在较短代码背后的任何魔法不被理解的情况下。(不仅仅是原作者,还有任何稍后会阅读和维护该代码的人)。一个例子是,取决于ilya意味着什么“,而不是将对象的HashSet转换为另一个字符串HashSet?以下使用'Except'的答案可能适用,也可能不适用。 – 2014-11-03 21:58:33

回答

8

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中的字符串。

相关问题