¿Por qué es la elección de este DefaultIfEmpty IEnumerable en lugar de cuerda?
-
28-09-2019 - |
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( ) };
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