Почему этот Defaultifempty выбирает ienumerable вместо строки?

StackOverflow https://stackoverflow.com/questions/3891374

Вопрос

 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>.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top