在ICollection<Bar>
实施ICollection<IBar>
的地方Bar
IBar
的推荐方式是什么?
是否像
一样简单collection = new List<Bar>();
ICollection<IBar> = collection as ICollection<IBar>?
还是有更好的方法吗?
答案 0 :(得分:2)
您必须投射列表中的每个项目并创建一个新项目,例如使用Cast
:
ICollection<IBar> ibarColl = collection.Cast<IBar>().ToList();
在.NET 4中,使用IEnumerable<T>
:
ICollection<IBar> ibarColl = collection.ToList<IBar>();
ICollection<IBar> ibarColl = collection.ConvertAll(b => (IBar)b);
后者可能会更有效率,因为它事先知道大小。
答案 1 :(得分:2)
您无法转发ICollection<IBar>
,但可以转为IEnumerable<IBar>
。
因此,如果您不打算在列表中添加内容,则可以执行以下操作:
IEnumerable<IBar> enumeration = (IEnumerable<IBar>)collection;
来自其他答案的解决方案实际上并未实施,但会创建一个新列表,不会反映原始列表的后续更改。
答案 2 :(得分:0)
只需使用
转换所有条目ICollection<IBar> ibars = collection.ConvertAll(bar => (IBar)bar);
我认为这个变体也是可读的。也许有方法可以用更高的性能来施展它......