是将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;
}
}
答案 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;
}