【问题标题】:How to convert an IEnumerable<AnonymousType> to a List<T>?如何将 IEnumerable<AnonymousType> 转换为 List<T>?
【发布时间】:2016-06-14 10:17:31
【问题描述】:

我使用 Linq 过滤了 List&lt;Application&gt; 以连接该列表中的两个字段并返回一个结果,现在需要将该列表返回给调用方法。

Linq 过滤的结果是 IEnumerable&lt;AnonymousType&gt; 类型,所以我不能返回它,因为我的方法返回类型是 List&lt;Application&gt;

我最初尝试的是使用 ToList 方法转换 IEnumerable,但这会引发编译器错误:

IEnumerable does not contain a definition for ToList()

问题:

如何将 IEnumerable 转换或强制转换为 List ?

代码:

这是对 List 执行的分配,用于连接两个字段并将其作为列表返回:

                var filteredAppList = applicationList.Select(c => new { c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName });

下面是我如何尝试将 IEnumerable 作为列表返回:

                return filteredAppList.ToList<Application>();

【问题讨论】:

  • 你为什么要转换回Application类?
  • 您的所有对象都 Application 对象。它们是匿名类型的实例。做你想做的事基本上涉及做.Select(x =&gt; new Application { RID = x.RID, ...})等——手动或自动;如果你想要Application 实例,为什么要切换到匿名类型?
  • RID_APP_FIELDApplication 中的属性吗?如果不是,您要么必须将其设为 1,要么以这种方式覆盖 ToStringreturn RID + " " + BusinessFriendlyName。然后你不需要创建新实例但你可以返回applicationList.Where(conditions).ToList()
  • RID_APP_FIELD 是通过连接 RID 和 BusinessFriendlyName 创建的匿名类型。 @TimSchmelter
  • @BrianJ:不,具体类中不能有匿名属性。要么添加一个属性,如:public string RID_APP_FIELD { get { return RID + " " + BusinessFriendlyName; } },要么以这种方式覆盖ToString

标签: c# linq list ienumerable anonymous-types


【解决方案1】:

问题是,之前的查询返回了一系列 匿名 对象,我们正在尝试将这些对象转换为 Application 类型。导致问题的原因,试试这个。

filteredAppList.Select(x=> new Application() 
                          {
                              // set properties.

                          })
               .ToList();

【讨论】:

  • 我需要返回格式为“RID + BusinessFriendlyName”的列表,因此过滤后的列表将类似于:“879898 TestAppOne”等。您能否详细说明如何设置上述属性?
  • 你如何定义Application类?您需要在此处设置应用程序属性。
【解决方案2】:

如果您知道需要返回 Application 对象,您应该避免使用匿名类型:

var filteredAppList = applicationList.Select(c => new Application { RID = c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName });

return filteredAppList.ToList();

我假设您的匿名类型与您的 Application 类型完全相同,但情况可能并非如此。您仍然可以在中间步骤中使用匿名类型,但运行时几乎无法自动将您的匿名类型转换为 Application,因此投影回所需类型的实例几乎是您唯一的选择。

var filteredAppList = applicationList.Select(c => new { RID = c.RID, RID_APP_FIELD = c.RID + " " + c.BusinessFriendlyName });

return filteredAppList.Select(anon => new Application { RID = anon.RID, OtherApplicationProperty = anon.RID_APP_FIELD }).ToList();

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多