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中,您可以使用带有CastOfType 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();