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( ) };
答案 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>
。