2011-04-25 13 views
15

tengo una List<Item>GroupBy con Id de posible objeto nulo

Cada artículo tiene un programa, que tiene un ID.

Si un artículo aún no está vinculada a un programa, Es programa será nulo.

me gustaría agrupar todos los artículos por su ID de programa

Eso es lo que he intentado:

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

Esto funciona si todos los artículos tienen un programa. Pero si un programa es nulo, se lanza una excepción System.NullReferenceException:

mensaje = "Referencia a objeto no establecida como una instancia de un objeto".

Creo que esto se debe a que, como Program es nulo, no puedo acceder a su Id.

Necesito todos los artículos, incluso si su programa es nulo (y me gustaría que agrupan por el programa, ya sea nula), por lo que su exclusión no es una opción.

He pensado en dos posibles soluciones, pero no estoy seguro de cómo hacer cualquiera de ellos:

Una de ellas sería algo como esto GroupBy(x => x.Programa == null || x.Programa.Id) (que no funciona)

El otro sería añadir un objeto de programa vacío donde el curso es nula, pero no sé cómo hacer esto

por supuesto, también estoy abierto a otras soluciones

Gracias de antemano

+0

Cuando haga un elemento de la lista, asígnele un valor 'nulo' que nunca usará como VACÍO para una cadena o -99999 para un int –

Respuesta

27

puede Suponiendo grupo todos los null programas juntos y Id será no negativo, ¿qué tal algo como esto:

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

Con el nuevo C# 6.0 también se puede utilizar:

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

donde el ?. es el operador condicional nulo. Esta posibilidad no estaba disponible cuando se formuló la pregunta.

+0

Creo que debería ponerlo como GroupBy (x => x? .Programa ? .ID) esto, entonces debe al hecho de que en su caso la propiedad Programma es nulo no el artículo :) – Martijn

+0

@Martijn Gracias por la corrección. Corregí mi respuesta. Decidí no manejar el caso en el que 'x' (el' Item' en sí mismo) es nulo (que aún explotará), pero solo el caso donde 'Programa' es nulo. Así es como interpreto la pregunta, y similar al espíritu de la respuesta de dcp. –

+0

Pasé la última semana tratando de resolver este problema. He tenido un problema en una combinación izquierda, y pensé que el problema fue cuando traté de establecer un posible valor nulo en 'select new' ... Y todo el tiempo el problema era el' groupby'. ¡Gracias! – Pablo

Cuestiones relacionadas