将IList <t1>转换为IList <baset1> </baset1> </t1>

时间:2010-07-22 16:48:05

标签: c#

是将IList<T1>转换为IList<BaseT1>的最简单方法吗?

IList<T1>.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;
    }
}

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

如果您在result列表初始化时指定Add列表的大小,并且直接在List<T>上调用List<BaseT1> result = new List<BaseT1>(p.Count); 方法,那么您的实现会获得更好的性能:

IList<BaseT1>

这样,在添加新项目时,它不会调整大量数组的大小。这应该会产生一个数量级的加速。

或者,您可以编写一个实现IList<T1>的包装器类,并在构造函数中使用{{1}}。

答案 2 :(得分:3)

IList<T1>.Count() is very large number!!!

是的,这意味着无论您使用什么语法糖,转换都需要O(n)时间和O(n)存储。您无法转换列表以避免重新创建它。如果可能,客户端代码可以将BaseT1的元素添加到列表中,违反了列表仅包含与T1兼容的对象的承诺。

获得成功的唯一方法是返回无法更改列表的接口类型。在这种情况下,这将是IEnumerable<BaseT1>。允许您迭代列表,没有别的。由于支持协方差,因此.NET 4.0中的转换是自动的。你必须在早期版本中编写一些胶水代码:

    public static IEnumerable<BaseT1> enumerate(IList<T1> p) {
        foreach (BaseT1 item in p) yield return item;
    }