【问题标题】:Convert IEnumerable in List<T>在 List<T> 中转换 IEnumerable
【发布时间】:2011-07-25 06:20:25
【问题描述】:

我正在创建一个在数据源中接收数据集或列表的控件

如何在 CreateChildControls 事件中将 IEnumerable 转换为 List?

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
{
    if (dataSource is System.Data.DataSet)
    {
    }
    else if(dataSource is IList)
    {
    }
}

【问题讨论】:

    标签: c# asp.net linq entity-framework ado.net


    【解决方案1】:

    通常会使用 Linq 的 IEnumerable&lt;T&gt;.ToList() 扩展方法,但在您的情况下,您不能(立即)使用它,因为您有非通用的 IEnumerable 接口。 Sou 你必须先施放它(也使用 Linq):

    datasource.Cast<object>().ToList();
    

    无论您的原始收藏实际上是什么,这都会成功。

    【讨论】:

    • 谢谢,我怎样才能得到原始类型而不设置对象类型?
    • 如果类型始终相同,则与datasource.Cast&lt;MySpecificType&gt;().ToList(); 一样简单,如果不是,则说明您有设计问题。一种解决方案是为您的集合中的所有项目类型提供一个通用接口,其中包含您在消费者方法CreateChildControls() 中需要的所有成员,例如datasource.Cast&lt;IDataInfo&gt;().ToList();
    • @bitbonk:如果您的代码不符合datasource is IList,那么它将是一个列表。无需创建列表,您只需投射到列表即可。那么“原始格式”的问题就不是问题了
    • @TechTestDude 你是对的。但是为了便于维护和可读性,我认为这些类型检查可能应该消失。过早的性能优化是万恶之源。
    • 我同意,转换回来不仅仅是为了性能,它增强了您的信息保留(与拥有对象列表相反,您拥有原始列表。
    【解决方案2】:

    我重新阅读了您的问题,您似乎收到了一个已经是列表或数据集的数据集,但它被转换为 IEnumerable。在这种情况下,只需执行

    IList myList = (IList)datasource //will throw exception if invalid
    

    IList myList = datasource as IList //mylist will be null if conversion cannot be made
    

    【讨论】:

    • dataSource.ToList() 不起作用,因为 dataSource 不是 IEnumerable 类型
    • 这是真的,我对其进行了编辑以反映这一点。无需创建新列表,因为如果“x 是 y”测试成功,那么简单的 (y)x 将以很少的处理开销产生结果
    【解决方案3】:

    回答您的问题“我如何才能获得原始类型而不设置对象类型?”。

    .NET 框架中的每个类型都包含GetType 方法来获取指定对象的类型。可以在ToList方法之前使用。

    【讨论】:

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