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