2011-04-25 62 views
15

我有一個List<Item>GroupBy與Id可能的空對象

每個項目都有一個程序,它有一個Id。

如果一個項目還沒有鏈接到一個程序,它的程序將是空的。

我想通過這組所有項目的計劃的ID

那就是我已經試過:

var listaAgrupada = client.ListarItens(null, null, null).GroupBy(x => x.Programa.Id).ToList(); 

這工作,如果所有項目有一個程序。但是,如果一個程序是空,則拋出System.NullReferenceException:

消息=「對象引用不設置到 一個對象的一個​​實例。」

我相信這是由於這樣的事實,因爲程序爲空,我無法訪問它的Id。

我需要所有的項目,即使他們的程序爲空(並且我希望他們按空程序分組),所以排除它們不是一種選擇。

我認爲有兩種可能的解決辦法,但我不知道如何做任何人:

一會是這樣的GroupBy(x => x.Programa == null || x.Programa.Id)(不工作)

其他將添加一個空的程序對象,其中的程序是空的,但我不知道如何做到這一點

當然,我也開放給其他的解決方案

在此先感謝

+0

當你建立一個列表項時,給它一個'null'值,你永遠不會像字符串一樣使用EMPTY或者-99999代表一個int – 2011-04-25 20:48:01

回答

27

一起假設你可以組所有的null程序和Id將非負的,怎麼是這樣的:

GroupBy(x => x.Programa == null ? -1 : x.Programa.Id) 
10

新的C#6.0,你也可以使用:

.GroupBy(x => x.Programa?.Id) 

哪裏?.是空條件運算符。問題被問到時,這種可能性不可用。

+0

我認爲你應該像GroupBy(x => x?.Programa ?.Id)這是因爲在他的情況下,Programma屬性爲空而不是Item :) – Martijn 2017-01-24 09:46:37

+0

@Martijn感謝您的糾正。我糾正了我的答案。我決定不處理'x'('Item'本身)爲null(仍然會炸掉)的情況,但只處理'Programa'爲null的情況。這就是我解釋這個問題的方式,類似於dcp答案的精神。 – 2017-01-24 10:35:46

+0

我花了上週試圖解決這個問題。我在左連接中遇到了一個問題,我認爲問題在於當我試圖在'select new'上設置一個可能的空值時......並且整個問題都是'groupby'。謝謝! – Pablo 2017-12-18 13:44:27