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( ) };
Était-ce utile?

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
scroll top