Casting List – 协方差/逆变问题
给出以下类型:
public interface IMyClass { } public class MyClass : IMyClass { }
我想知道如何将List
转换为List
? 关于协方差/逆变主题,我并不完全清楚,但据我所知,由于这个原因,我不能仅仅清楚地列出清单。
我只能提出这个微不足道的解决方案; 缺乏优雅,浪费资源:
... public List ConvertItems(List input) { var result = new List(input.Count); foreach (var item in input) { result.Add(item); } return result; } ....
你怎么能以更优雅/高效的方式解决它?
( 请注意,我需要.NET 2.0解决方案,但为了完整性,我也很高兴看到使用更新框架版本的更优雅的解决方案。 )
最简单的方法可能是使用ConvertAll
:
List converted = original.ConvertAll (x => x);
即使您使用的是.NET 2,如果您使用的是VS2008或更高版本,也可以使用lambda语法。 否则,总会有匿名方法:
List converted = original.ConvertAll ( delegate (MyClass x) { return x; });
在.NET 3.5中,您可以使用带有Cast
, OfType
LINQ,甚至只需Select
:
var converted = original.Cast().ToList(); var converted = original.OfType ().ToList(); var converted = original.Select(x => (IMyClass) x).ToList();
在.NET 4.0中,由于IEnumerable
的协方差,您可以直接使用ToList
而无需中间转换:
var converted = original.ToList();
它需要是一个列表吗? IEnumerable
解决方案可能更有效:
public IEnumerable ConvertItems(List input) { foreach (var item in input) { yield return (IMyClass)item; } }
(.NET 3.5解决方案)
List list = new List { ... }; List converted = list.Cast ().ToList();