1
 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( ) };
4

2 回答 2

4

module是一个字符串。

字符串实现IEnumerable<char>

您正在调用该Enumerable.DefaultIfEmpty方法,该方法扩展了IEnumerable<T>.
此方法永远不能返回除IEnumerable<T>.

编辑:如果你想用非空值替换null值,你可以使用空合并运算符:module

group aName by module ?? "SomeValue"

但是,由于该子句,module将永远不会真正成为。 然后,您还应该从最后的子句中删除。nullwhere module!=null
??"Other"select

于 2010-10-08T14:10:31.783 回答
1

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

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

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

于 2010-10-08T14:11:18.063 回答