将IList转换为List

89
我想将类型为 IList 的对象转换成 List 类型,但每次都出现错误。
List<SubProduct> subProducts= Model.subproduct;

Model.subproduct 返回 IList<SubProduct>


9
最好针对接口(IList)编写程序,而不是实现(List)。 转换为List是不必要的。 如果偶然进入该代码路径的IList实现不是List,那么现在必须添加错误处理。 - Brian Leahy
8
是的,但是 IList 没有 List 所拥有的功能,例如 AddRange - Serj Sagan
9个回答

154

尝试一下

List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);
或者
List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;

6
这是正确的答案,但你为什么要使用List而不用IList呢?大多数情况下,使用IList会更好。 - Keith Rousseau
3
IList<SubProduct> subProducts = Model.subproduct; - Brian Leahy
5
@KeithRousseau 我在需要使用AddRange()方法时遇到了问题。 - ScubaSteve
16
第二个选项并不安全,因为它假设 Model.subproducts 在内部已经是 List<SubProduct> 类型。如果它是 IList<SubProduct> 的其他实现,比如 ReadOnlyCollection<SubProduct>,它将会静默返回 null,并可能在程序执行后导致非常令人困惑的空引用异常。而且实际上,如果我们知道它总是会是一个 List<T>,那么第一次返回一个 IList<T> 有什么意义呢? - sstan

35

这样怎么样:

List<SubProduct> subProducts = Model.subproduct.ToList();

请注意,ToList() 方法会创建一个副本,可能会对性能和内存产生影响。 - fose

19

在我的情况下,我不得不这样做,因为没有任何建议的解决方案可用:

List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList();

5
List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct;

隐式转换失败是因为List<>实现了IList,而不是反过来。所以你可以这样说:IList<T> foo = new List<T>(),但不能这样说:List<T> foo = (一些返回IList的方法或属性)

2

如果您有一个包含接口的 IList,可以像这样进行转换:

List 转为 IList

List<Foo> Foos = new List<Foo>(); 
IList<IFoo> IFoos = Foos.ToList<IFoo>();

IList转List

IList<IFoo> IFoos = new List<IFoo>();
List<Foo> Foos = new List<Foo>(IFoos.Select(x => (Foo)x));

这假设 Foo 已经实现了 IFoo 接口。

0
List<ProjectResources> list = new List<ProjectResources>();        
IList<ProjectResources> obj = `Your Data Will Be Here`;
list = obj.ToList<ProjectResources>();

这将把IList对象转换为List对象。


0

其他答案都建议使用 IList 的 AddRange。

更优雅的解决方案是实现一个扩展到 IList 的方法来完成这项工作,避免了强制转换。

在 VB.NET 中:

<Extension()>
Public Sub AddRange(Of T)(ByRef Exttype As IList(Of T), ElementsToAdd As IEnumerable(Of T))
   For Each ele In ElementsToAdd
      Exttype.Add(ele)
   Next
End Sub

在C#中:

public void AddRange<T>(this ref IList<T> Exttype, IEnumerable<T> ElementsToAdd)
{
    foreach (var ele in ElementsToAdd)
    {
        Exttype.Add(ele);
    }
}

-1
public async Task<List<TimeAndAttendanceShift>> FindEntitiesByExpression(Expression<Func<TimeAndAttendanceShift, bool>> predicate)
{
    IList<TimeAndAttendanceShift> result = await _dbContext.Set<TimeAndAttendanceShift>().Where(predicate).ToListAsync<TimeAndAttendanceShift>();
    return result.ToList<TimeAndAttendanceShift>();
}

-3

这是将泛型对象列表转换为字符串列表的最佳选项。

object valueList;
List<string> list = ((IList)valueList).Cast<object>().Select(o => o.ToString()).ToList();

valueList必须是对象列表。 - user4993352

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接