Pourquoi est-ce DefaultIfEmpty choisir IEnumerable au lieu de chaîne?
-
28-09-2019 - |
Question
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( ) };
La solution
module
est une chaîne.
string outils IEnumerable<char>
.
Vous appelez la méthode Enumerable.DefaultIfEmpty
, qui étend IEnumerable<T>
.
Cette méthode ne peut jamais retourner quoi que ce soit autre qu'un IEnumerable<T>
.
EDIT : Si vous voulez remplacer les valeurs de null
de module
avec une valeur non nulle, vous pouvez utiliser l'opérateur null coalescent:
group aName by module ?? "SomeValue"
Cependant, module
ne sera jamais fait null
, en raison de la clause de where module!=null
.
Vous devriez alors également supprimer ??"Other"
de la clause de select
finale.
Autres conseils
Parce que, dans ce cas, module
est une chaîne:
let module = interestedModules
.FirstOrDefault(x => aName
.StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
Lorsque vous appelez l'une des extensions IEnumerable sur une chaîne, il se décompose en un IEnumerable<char>
.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow