将IList投射到列表


72

我正在尝试将IList类型转换为List类型,但是每次都会出错。

List<SubProduct> subProducts= Model.subproduct;

Model.subproduct返回IList<SubProduct>


9
最好是针对接口(IList)而不是隐含程序(List)进行编程。这是不需要的演员表。现在,如果IList的实现(不是List)进入该代码路径的可能性很大,则必须添加错误处理。
Brian Leahy 2010年

7
是的,但是IList没有东西,List例如AddRange
Serj Sagan

Answers:


132

尝试

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

要么

List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;

5
这是正确的答案,但是您是否有理由要处理列表而不是IList?大多数情况下,使用IList是更好的选择。
基思·卢梭

3
IList <SubProduct> subProducts = Model.subproduct;
Brian Leahy 2010年

4
@KeithRousseau当需要使用AddRange()方法时,我遇到了这个问题。
ScubaSteve

8
第二种选择并不安全,因为它假定该Model.subproducts类型已经List<SubProduct>被掩盖了。如果是的不同实现IList<SubProduct>,例如ReadOnlyCollection<SubProduct>,它将静默返回null并可能NullReferenceException在以后的程序执行中造成非常混乱的情况。实际上,如果我们知道它始终是a List<T>,那么IList<T>首先返回a的意义是什么?
斯坦(Sstan)


13

就我而言,我必须这样做,因为没有建议的解决方案可用:

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

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

隐式转换失败是因为List<>实现IList,反之亦然。所以你可以说IList<T> foo = new List<T>(),但不能List<T> foo = (some IList-returning method or property)


9
只是一个小问题:List <T>不是从IList派生的,它实现了IList。“派生”一词表示两者之间存在继承关系。
克里斯·邓纳维

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

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


0

其他答案都建议将AddRange与IList一起使用。

避免强制转换的更优雅的解决方案是实现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);
    }
}

0

如果您有一个包含接口的IList,则可以按以下方式进行转换:

列出到IList

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

IList到列表

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

假设Foo已经IFoo接口。


0
    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必须是对象列表
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.