【问题标题】:Why is this defaultIfEmpty choosing ienumerable<char> instead of string?为什么这个 defaultIfEmpty 选择 ienumerable<char> 而不是字符串?
【发布时间】:2010-10-08 14:07:38
【问题描述】:
 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( ) };

【问题讨论】:

  • 如果不清楚,我有一个来自 xml 文件的程序集列表,我想查看 interested modules 命名空间中的程序集以及 interestedModules 名称或其他名称(如果是)没有一个我特别感兴趣
  • 你期望它返回什么?
  • 你为什么要这么称呼它?
  • 因为我不希望通过过滤掉模块为空的结果来分组
  • 那你为什么有where module!=null?查看我的编辑。

标签: c# linq group-by defaultifempty


【解决方案1】:

module 是一个字符串。

字符串实现IEnumerable&lt;char&gt;

您正在调用 Enumerable.DefaultIfEmpty 方法,该方法扩展了 IEnumerable&lt;T&gt;
此方法永远不会返回 IEnumerable&lt;T&gt; 以外的任何内容。

编辑:如果要将modulenull 值替换为非空值,可以使用空合并运算符:

group aName by module ?? "SomeValue"

但是,module 实际上永远不会是 null,因为 where module!=null 子句。
然后,您还应该从最后的 select 子句中删除 ??"Other"

【讨论】:

    【解决方案2】:

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

    let module = interestedModules
                     .FirstOrDefault(x => aName
                     .StartsWith(x, StringComparison.InvariantCultureIgnoreCase))
    

    当您对字符串调用任何 IEnumerable 扩展时,它会分解为 IEnumerable&lt;char&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2020-01-10
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2011-01-22
      相关资源
      最近更新 更多