Почему этот defaultIfEmpty выбирает ienumerable <char>вместо строки? - PullRequest
1 голос
/ 08 октября 2010
 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( ) };

Ответы [ 2 ]

4 голосов
/ 08 октября 2010

module - это строка.

String реализует IEnumerable<char>.

Вы вызываете метод Enumerable.DefaultIfEmpty, который расширяет IEnumerable<T>.
Этот метод никогда не может вернуть ничего, кроме IEnumerable<T>.

РЕДАКТИРОВАТЬ : Если вы хотите заменить null значения module ненулевым значением, вы можете использовать оператор объединения нулей:

group aName by module ?? "SomeValue"

Однако module фактически никогда не будет null из-за предложения where module!=null.
Затем вы должны также удалить ??"Other" из последнего предложения select.

1 голос
/ 08 октября 2010

Поскольку в этом случае module является строкой:

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

Когда вы вызываете любое из расширений IEnumerable в строке, оно разлагается на IEnumerable<char>.

...