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( ) };
问问题
921 次
2 回答
4
module
是一个字符串。
字符串实现IEnumerable<char>
。
您正在调用该Enumerable.DefaultIfEmpty
方法,该方法扩展了IEnumerable<T>
.
此方法永远不能返回除IEnumerable<T>
.
编辑:如果你想用非空值替换null
值,你可以使用空合并运算符:module
group aName by module ?? "SomeValue"
但是,由于该子句,module
将永远不会真正成为。
然后,您还应该从最后的子句中删除。null
where 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 回答