2014-11-03 114 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中的字符串。

相關問題