2012-07-24 50 views
1

我試圖執行下面的代碼,它工作正常,如果myObject是!= null,但如果myObject爲null則拋出「值不能爲空」錯誤。理想情況下,如果myObject的爲null,則我想只是有HashSet的有0Hashset「值不能爲空」錯誤

var ids = new HashSet<int>(myObject.Select(p => p.ID)); 

我已經嘗試了一些不同的東西一個值。我不確定爲什麼我認爲這會起作用。

var ids = new HashSet<int>(myObject.Select(p => p.ID).Where(p => p != null)); 

和這似乎應該工作。

var ids = new HashSet<int>(myObject.Select(p => (p == null) ? 0 : p.ID)); 

最後這個工作,但它似乎有一個更好的方法。

var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0}); 

任何人都有更好的方法來做到這一點?

回答

0

如果myObject的是零,你的代碼轉換爲

var ids = new HashSet<int>(null.Select(p => p.ID)); 

不能使用選擇擴展方法斷空的。

你的替代

var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0}); 

是最緊湊的形式,我所知道的,以滿足您的要求,但肯定你可以隱藏在方法的複雜性或擴展方法,如果你喜歡。

+0

你以爲我犧牲可讀性緊湊?我看着它,這是有道理的,但其他人會看到這行代碼,並發現它太過複雜? – Jay 2012-07-24 13:31:43

0

現在,你的回答可以清理只是有點:

var ids = new HashSet<int>(myObject?.Select(p => p.ID) ?? new [] {0});