为什么defaultIfEmpty选择ienumerable <char>而不是string?</char>

时间:2010-10-08 14:07:39

标签: c# linq group-by defaultifempty

 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 个答案:

答案 0 :(得分:4)

module是一个字符串。

字符串实现IEnumerable<char>

您正在调用Enumerable.DefaultIfEmpty方法,该方法扩展了IEnumerable<T> 此方法永远不会返回IEnumerable<T>以外的任何内容。

编辑:如果要将null的{​​{1}}值替换为非空值,则可以使用null-coalescing运算符:

module

但是,由于group aName by module ?? "SomeValue" 条款,module实际上永远不会是null
然后,您还应该从最终的where module!=null子句中删除??"Other"

答案 1 :(得分:1)

因为在这种情况下,module是一个字符串:

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

当您在字符串上调用任何IEnumerable扩展时,它会分解为IEnumerable<char>