【问题标题】:LINQ ToDictionary From Enumerable of Anonymous ObjectLINQ ToDictionary 来自匿名对象的枚举
【发布时间】:2019-02-18 15:46:37
【问题描述】:

此 LINQ 语句中的 ToDictionary() 方法调用需要参数。就目前而言,ToDictionary 部分是红色波浪线,因为缺乏更好的技术术语。错误:没有重载需要 0 个参数。是的,我知道。

我无法将 lambda 添加到 ToDictionary 方法调用,因为 Intellisense 正在用它的建议覆盖我的 lambda。换句话说,如果我输入“x”,它会用 XmlReader 替换它。啊。

我已经尝试过使用和不使用 AsEnumerable。我从 StackOverflow 帖子中借用了大部分代码,但我添加了字典部分。

我在某处缺少括号吗?哈哈!

var props = (from p in _type.GetProperties()
             let attr = p.GetCustomAttribute<ExcelExportAttribute>()
             where attr != null && attr.ReportId.ToString() == reportID
             select new {Prop = p, Att = attr })
             .AsEnumerable()
             .ToDictionary<PropertyInfo, ExcelExportAttribute>();

VS 中的错误

严重性代码描述项目文件行抑制状态错误 CS1929“IEnumerable”不包含“ToDictionary”的定义,并且最佳扩展方法重载“Enumerable.ToDictionary(IEnumerable, Func, IEqualityComparer)”需要接收器类型'IEnumerable' WFG.UtilityLib.Excel C:\Users\kbessel\source\repos\WFG.UtilityLib.Excel\WFG.UtilityLib.Excel\ExcelExport.cs 142 活动

【问题讨论】:

  • .ToDictionary(item =&gt; item.Prop, item =&gt; item.Att);: 你应该提供 keyvalue
  • 另外你不需要AsEnumerable
  • 再一次,我无法在 ToDictionary 调用中添加 lambda。
  • 请检查您是否有using System.Linq;,因为ToDictionary() 是一个扩展方法
  • @KayBee718 当 itellisense 开始为您的 lambda 建议内容时,只需按 ESC。我也觉得很烦。

标签: c# linq


【解决方案1】:

我无法将 lambdas 添加到 ToDictionary 方法调用,因为 Intellisense 正在用它的建议覆盖我的 lambda。换句话说,如果我输入“x”,它将替换为XmlReader

这是一个需要克服的简单问题:输入 x,然后按 Esc 关闭 Intellisense 下拉菜单。根据需要继续输入表达式:

var props = _type.GetProperties()
    .SelectMany(p => new {Prop = p, Attr = p.GetCustomAttribute<ExcelExportAttribute>()})
    .Where(p => p?.ReportId?.ToString() == reportId)
    .ToDictionary(p => p.Prop, p => p.Attr);

【讨论】:

  • 谢谢。现在我已经添加了一个 lambda 并删除了 AsEnumerable(),ToDictionary() 之前的所有内容都处于错误模式(红色波浪状)。
  • 谢谢,但我对Linq的了解有限,我无法弄清楚简化代码中的错误。它不喜欢 Select 或 reportId。
  • 其实就是Select。严重性代码描述项目文件行抑制状态错误 CS1061“ExcelExportAttribute”不包含“Select”的定义,并且找不到接受“ExcelExportAttribute”类型的第一个参数的扩展方法“Select”(您是否缺少 using 指令或程序集参考?)WFG.UtilityLib.Excel C:\Users\kbessel\source\repos\WFG.UtilityLib.Excel\WFG.UtilityLib.Excel\ExcelExport.cs 149 活动
【解决方案2】:

您需要完全省略泛型类型,如下所示:

.ToDictionary(x => x.Prop, x => x.Att);

原因是扩展方法不需要两个而是三个泛型类型:一个用于“this”参数,另外两个用于“常规”参数 - 或者没有,因为编译器可以从参数派生类型.

您可以明确指定所有 3 种类型,但这几乎没有任何用途,因为它们可以自动派生。

【讨论】:

  • 您可以保留.Select。这一行仅替换了原来的.ToDictionary&lt;PropertyInfo, ExcelExportAttribute&gt;() 部分+ 解释了为什么它需要有所不同。如果您在 .ToDict 调用上执行“转到定义”,您会看到它是用 3 种泛型类型定义的,而不是您尝试做的 2 种。
  • 如果您不熟悉 扩展方法 的工作原理,那么绝对值得一读(这是当今高度使用的功能,Linq 不会是没有它也一样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2011-11-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多