GroupBy,Id为可能的null对象

Ort*_*iga 21 c# linq

我有一个 List<Item>

每个项目都有一个程序,它有一个Id.

如果项目尚未链接到某个程序,则该程序将为null.

我想按照程序的ID对所有项目进行分组

这就是我尝试过的:

var listaAgrupada = client.ListarItens(null, null, null).GroupBy(x => x.Programa.Id).ToList();
Run Code Online (Sandbox Code Playgroud)

如果所有项目都有程序,则此方法有效.但是如果程序为null,则抛出System.NullReferenceException:

Message ="对象引用未设置为对象的实例."

我相信这是因为,由于程序为空,我无法访问它的Id.

我需要所有的项目,即使他们的程序为空(我也希望它们按空程序分组),所以排除它们不是一个选项.

我想过两个可能的解决方案,但我不确定如何做任何一个:

一个会是这样的GroupBy(x => x.Programa == null || x.Programa.Id)(这是行不通的)

另一个是添加一个程序为空的空程序对象,但我不知道如何做到这一点

当然,我也对其他解决方案持开放态度

提前致谢

dcp*_*dcp 33

假设您可以将所有null程序组合在一起并且Id是非负面的,那么如下所示:

GroupBy(x => x.Programa == null ? -1 : x.Programa.Id)
Run Code Online (Sandbox Code Playgroud)


Jep*_*sen 16

使用新的C#6.0,您还可以使用:

.GroupBy(x => x.Programa?.Id)
Run Code Online (Sandbox Code Playgroud)

其中?.是空条件运算符.当问到这个问题时,这种可能性是不可行的.

  • 我认为您应该像GroupBy(x =&gt; x?.Programa?.Id)这样表示,因为在他的情况下Programma属性为null而不是Item :) (2认同)

小智 7

混合两个答案,这也可以使用:

.GroupBy(x => x?.Programa?.Id ?? -1)
Run Code Online (Sandbox Code Playgroud)

使用 ”??” 在“x”或“x.Program”为空的情况下定义默认值。