Pregunta

 from a in mainDoc.XPathSelectElements("//AssembliesMetrics/Assembly/@Assembly")
                            let aVal=a.Value
                            where aVal.IsNullOrEmpty( )==false&&aVal.Contains(" ")
                            select aVal.Substring(0, aVal.IndexOf(' '))
                              into aName
                              let interestedModules=new[ ] { "Core", "Credit", "Limits", "Overdraft" }
                              where aName.Contains(".")
                              let module=
                                interestedModules
                                .FirstOrDefault(x => aName
                                  .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
                              where module!=null
                              group aName by module.DefaultIfEmpty() // ienumerable<char>, why?
                                into groups
                                select new { Module=groups.Key??"Other", Count=groups.Count( ) };
¿Fue útil?

Solución

module es una cadena.

instrumentos de Cuerda IEnumerable<char>.

Usted está llamando al método Enumerable.DefaultIfEmpty, que se extiende IEnumerable<T>.
Este método no puede volver otra cosa que un IEnumerable<T>.

Editar : Si desea reemplazar los valores de null module con un valor no nulo, se puede utilizar el operador nulo coalescencia:

group aName by module ?? "SomeValue"

Sin embargo, module nunca realmente ser null, debido a la cláusula where module!=null.
A continuación, debe también eliminar ??"Other" de la cláusula select final.

Otros consejos

Debido a que, en este caso, module es una cadena:

let module = interestedModules
                 .FirstOrDefault(x => aName
                 .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))

Cuando se llama a cualquiera de las extensiones de IEnumerable en una cuerda, que se descompone en un IEnumerable<char>.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top