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>.

编辑: :如果您想替换 nullmodule 使用非零值,您可以使用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>.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top