Perché questo DefaultIfEmpty scegliendo IEnumerable al posto di stringa?
-
28-09-2019 - |
Domanda
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( ) };
Soluzione
module
è una stringa.
attrezzi String IEnumerable<char>
.
Si sta chiamando il metodo Enumerable.DefaultIfEmpty
, che si estende IEnumerable<T>
.
Questo metodo può non tornare mai più qualcosa di diverso da un IEnumerable<T>
.
Modifica : Se si desidera sostituire i valori null
di module
con un valore non nullo, è possibile utilizzare l'operatore null coalescenza:
group aName by module ?? "SomeValue"
Tuttavia, module
sarà mai effettivamente null
, a causa della clausola di where module!=null
.
Si dovrebbe quindi rimuovere anche ??"Other"
dalla clausola select
finale.
Altri suggerimenti
A causa, in questo caso, module
è una stringa:
let module = interestedModules
.FirstOrDefault(x => aName
.StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
Quando si chiama una delle estensioni IEnumerable su una stringa, si decompone in un IEnumerable<char>
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow