为什么这种默认设备选择ienumerable 而不是字符串?
-
28-09-2019 - |
题
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( ) };
解决方案
module
是字符串。
字符串实施 IEnumerable<char>
.
您正在打电话 Enumerable.DefaultIfEmpty
方法,扩展 IEnumerable<T>
.
除了 IEnumerable<T>
.
编辑: :如果您想替换 null
值 module
使用非零值,您可以使用Null-CoAlescing Operator:
group aName by module ?? "SomeValue"
然而, module
永远不会是 null
, ,因为 where module!=null
条款。
然后您也应该删除 ??"Other"
从决赛 select
条款。
其他提示
因为在这种情况下, module
是一个字符串:
let module = interestedModules
.FirstOrDefault(x => aName
.StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
当您调用字符串上的任何iEnumerable扩展名时,它将分解为 IEnumerable<char>
.
不隶属于 StackOverflow