为了账号安全,请及时绑定邮箱和手机立即绑定

LINQ ToDictionary 来自匿名对象的枚举

LINQ ToDictionary 来自匿名对象的枚举

C#
梦里花落0921 2022-01-16 16:12:19
此 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 活动
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

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

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

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

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


查看完整回答
反对 回复 2022-01-16
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我无法在ToDictionary方法调用中添加 lambda,因为 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);


查看完整回答
反对 回复 2022-01-16
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信