Почему этот Defaultifempty выбирает ienumerable вместо строки?
-
28-09-2019 - |
Вопрос
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( ) };
Решение
module
это строка.
Струнные реализации IEnumerable<char>
.
Вы называете Enumerable.DefaultIfEmpty
метод, который расширяется IEnumerable<T>
.
Этот метод никогда не может вернуть ничего, кроме IEnumerable<T>
.
РЕДАКТИРОВАТЬ: Если вы хотите заменить null
ценности module
С ненулевым значением вы можете использовать оператор Null-Coalescing:
group aName by module ?? "SomeValue"
Однако, module
никогда не будет null
, из-за where module!=null
пункт.
Вы должны также удалить ??"Other"
от финала select
пункт.
Другие советы
Потому что в этом случае, module
это строка:
let module = interestedModules
.FirstOrDefault(x => aName
.StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
Когда вы называете какое -либо из обоснованных расширений на строке, он разлагается в IEnumerable<char>
.
Не связан с StackOverflow