Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个defaultIfEmpty选择ienumerable而不是string?_C#_Linq_Group By_Defaultifempty - Fatal编程技术网

C# 为什么这个defaultIfEmpty选择ienumerable而不是string?

C# 为什么这个defaultIfEmpty选择ienumerable而不是string?,c#,linq,group-by,defaultifempty,C#,Linq,Group By,Defaultifempty,模块是一个字符串 字符串实现IEnumerable 您正在调用Enumerable.DefaultIfEmpty方法,该方法扩展了IEnumerable。 此方法只能返回IEnumerable 编辑:如果要用非空值替换模块的空值,可以使用空合并运算符: from a in mainDoc.XPathSelectElements("//AssembliesMetrics/Assembly/@Assembly") let aVal=a.Val

模块是一个字符串

字符串实现IEnumerable

您正在调用Enumerable.DefaultIfEmpty方法,该方法扩展了IEnumerable。 此方法只能返回IEnumerable

编辑:如果要用非空值替换模块的空值,可以使用空合并运算符:

 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( ) };
然而,由于where模块,模块实际上永远不会为空=空子句。 然后还应该从最后的select子句中删除??Other。

模块是一个字符串

字符串实现IEnumerable

您正在调用Enumerable.DefaultIfEmpty方法,该方法扩展了IEnumerable。 此方法只能返回IEnumerable

编辑:如果要用非空值替换模块的空值,可以使用空合并运算符:

 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( ) };
然而,由于where模块,模块实际上永远不会为空=空子句。 然后还应该从最后的select子句中删除??Other。

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

group aName by module ?? "SomeValue"
在对字符串调用任何IEnumerable扩展时,它将分解为IEnumerable。

因为在本例中,模块是字符串:

group aName by module ?? "SomeValue"

当您对字符串调用任何IEnumerable扩展名时,它会分解为IEnumerable。

如果不清楚,我有一个xml文件中的程序集列表,我想看看在一个感兴趣的模块名称空间中有多少个模块,以及感兴趣的模块名称或其他名称,如果它不是我特别感兴趣的模块名称,那么您希望它返回什么?为什么要调用它?因为我不想通过过滤掉模块为空的结果来创建组,那么为什么要使用where模块=无效的请参阅我的编辑。如果不清楚,我有一个xml文件中的程序集列表,我想看看在一个感兴趣的模块名称空间中有多少个模块,以及感兴趣的模块名称或其他名称,如果它不是我特别感兴趣的模块名称,那么您希望它返回什么?为什么要调用它?因为我不想通过过滤掉模块为空的结果来创建组,那么为什么要使用where模块=无效的请参阅我的编辑。