Warum ist die Wahl dieses DefaultIfEmpty IEnumerable statt String?
-
28-09-2019 - |
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( ) };
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