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( ) };
È stato utile?

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