Frage

 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( ) };
War es hilfreich?

Lösung

module ist eine Zeichenfolge.

String implementiert IEnumerable<char>.

Sie fordern die Enumerable.DefaultIfEmpty Methode, die IEnumerable<T> erstreckt.
Diese Methode kann nie etwas anderes als ein IEnumerable<T> zurück.

Bearbeiten : Wenn Sie null Werte von module mit einem Nicht-Null-Wert ersetzt werden sollen, können Sie den Null-Koaleszenz-Operator verwenden:

group aName by module ?? "SomeValue"

Allerdings module nie wirklich seine null, wegen der where module!=null Klausel.
Sie sollten dann auch ??"Other" aus der letzten select Klausel entfernen.

Andere Tipps

Da in diesem Fall module ist eine Zeichenfolge:

let module = interestedModules
                 .FirstOrDefault(x => aName
                 .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))

Wenn Sie an einer Schnur eine der IEnumerable Erweiterungen nennen, zerfällt sie in einem IEnumerable<char>.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top