将IEnumerable <object>转换为List <object>

时间:2016-03-22 21:12:00

标签: c# asp.net-mvc-5

我有以下代码:

public IList<MyObject> GetSomeData(string inputParam)
{
    var temp = repository.GetData(inputParam);
    var list = temp as List<MyObject>;
    return list;
}

repository.GetData的返回值为IEnumerable<IMyObject>

当我查看temp的值时,它有400多条记录。我把它投射到列表的那一刻,它变成了空。为什么这个演员不可能?

2 个答案:

答案 0 :(得分:4)

它返回null,因为IEnumerable实际上不是列表。只有当IEnumerable碰巧是List而不是其他类型的序列时,强制转换才会成功。如果您想要一个列表,则需要创建一个新列表并将序列中的项添加到该列表中。

答案 1 :(得分:3)

除非从repository.GetData返回的值的基础对象与您尝试将其投射到的值匹配,否则结果将始终为null。由于方法的通用元素类型和实际从repository.GetData返回的内容是不同的,因此您需要进行一些转换才能获得所需的结果

假设MyObject实现IMyObject我至少可以考虑使用System.Linq获取您所寻求的结果。

选项1:Cast<T>()

  

将System.Collections.IEnumerable的元素转换为指定的类型。

首先使用temp linq扩展转换Cast<MyObject>()的内容,然后使用ToList<T>()扩展方法为您提供结果IList<MyObject>

public IList<MyObject> GetSomeData(string inputParam)
{
    //repository.GetData returns IEnumerable<IMyObject>
    var temp = repository.GetData(inputParam);
    var list = temp.Cast<MyObject>().ToList();
    return list;
}

选项2:OfType<T>()

  

根据指定的类型过滤System.Collections.IEnumerable的元素。

使用temp linq扩展程序过滤OfType<MyObject>()的内容,然后使用ToList<MyObject>()扩展程序获得结果IList<MyObject>

public IList<MyObject> GetSomeData(string inputParam)
{
    //repository.GetData returns IEnumerable<IMyObject>
    var temp = repository.GetData(inputParam);
    var list = temp.OfType<MyObject>().ToList();
    return list;
}