首页 > 解决方案 > LINQ ToDictionary 来自匿名对象的枚举

问题描述

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

我无法将 lambdas 添加到 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 活动

标签: c#linq

解决方案


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

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

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

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


推荐阅读