C# 转换IList<;T1>;到IList<;BaseT1>;

C# 转换IList<;T1>;到IList<;BaseT1>;,c#,C#,将IList转换为IList的最简单方法是什么 IList.Count()是一个非常大的数字 class BaseT1 { }; class T1 : BaseT1 { static public IList<BaseT1> convert(IList<T1> p) { IList<BaseT1> result = new List<BaseT1>(); foreach (BaseT1 baseT1

IList
转换为
IList
的最简单方法是什么

IList.Count()
是一个非常大的数字

class BaseT1 { };
class T1 : BaseT1
{
    static public IList<BaseT1> convert(IList<T1> p)
    {
        IList<BaseT1> result = new List<BaseT1>();
        foreach (BaseT1 baseT1 in p)
            result.Add(baseT1);
        return result;
    }
}
classbaset1{};
T1类:BaseT1
{
静态公共IList转换(IList p)
{
IList结果=新列表();
foreach(p中的BaseT1 BaseT1)
结果。添加(baseT1);
返回结果;
}
}
林克

var baseList = derivedList.Cast<TBase>();
var baseList=derivedList.Cast();
编辑:


Cast
返回一个IEnumerable,是否需要在
列表中使用它<代码>列表
可能是一个处理成本很高的类

如果在初始化时指定
结果
列表的大小,并直接调用
列表
上的
添加
方法,您的实现将获得更好的性能:

List<BaseT1> result = new List<BaseT1>(p.Count);
列表结果=新列表(p.Count);
这样,当添加新项目时,就不会调整大量数组的大小。这将产生一个数量级的加速

或者,您可以编写一个包装器类,实现
IList
,并在构造函数中获取
IList

IList.Count()是一个非常大的数字!!!
IList<T1>.Count() is very large number!!!
是的,这意味着无论使用什么语法,转换都需要O(n)时间和O(n)存储。无法强制转换列表以避免重新创建它。如果可能的话,客户端代码可以向列表中添加BaseT1元素,这违反了列表只包含与T1兼容的对象的承诺

取得成功的唯一方法是返回一个不能更改列表的接口类型。在这种情况下,它将是
IEnumerable
。允许您迭代列表,无需其他操作。由于对协方差的支持,这种转换在.NET4.0中是自动进行的。您必须在早期版本中编写一些粘合代码:

    public static IEnumerable<BaseT1> enumerate(IList<T1> p) {
        foreach (BaseT1 item in p) yield return item;
    }
公共静态IEnumerable枚举(IList p){
foreach(p中的BaseT1项)收益返回项;
}

为什么还要使用列表?只需使用yield return,因为他希望它在
IList
中,而不是
IEnumerable
中。Linq不是所有问题的答案。IList=System.Collections.Generic.IListIList=System.Collections.Generic.IList