15

给定以下类型:

public interface IMyClass { }
public class MyClass : IMyClass { }

我想知道如何将 a 转换List<MyClass>为 a List<IMyClass>?我对协变/逆变主题并不完全清楚,但我知道我不能因此而简单地投射列表。

我只能想出这个微不足道的解决方案;缺乏任何优雅,浪费资源:

...
public List<IMyClass> ConvertItems(List<MyClass> input)
{
   var result = new List<IMyClass>(input.Count);
   foreach (var item in input)
   {
       result.Add(item);
   }
   return result;
}
....

您如何以更优雅/高性能的方式解决它?

请注意,我需要 .NET 2.0 解决方案,但为了完整起见,我也很乐意看到使用更新框架版本的更优雅的解决方案。

4

3 回答 3

24

最简单的方法可能是使用ConvertAll

List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);

即使您使用的是 .NET 2,如果您使用的是 VS2008 或更高版本,也可以使用 lambda 语法。否则,总会有匿名方法:

List<IMyClass> converted = original.ConvertAll<IMyClass>(
    delegate (MyClass x) { return x; });

在 .NET 3.5 中,您可以将 LINQ 与 LINQ 一起使用CastOfType甚至只是Select

var converted = original.Cast<IMyClass>().ToList();
var converted = original.OfType<IMyClass>().ToList();
var converted = original.Select(x => (IMyClass) x).ToList();

在 .NET 4.0 中,由于 的协方差,您可以ToList直接使用而无需中间转换IEnumerable<T>

var converted = original.ToList<IMyClass>();
于 2011-02-08T10:20:34.270 回答
2

它需要是一个列表吗?一个IEnumerable解决方案可能更有效:

 public IEnumerable<IMyClass> ConvertItems(List<MyClass> input)
 {
    foreach (var item in input)
    {
        yield return (IMyClass)item;
    }
 } 
于 2011-02-08T10:23:10.280 回答
0

(.NET 3.5 解决方案)

List<MyClass> list = new List<MyClass> { ... };
List<IMyClass> converted = list.Cast<IMyClass>().ToList();
于 2011-02-08T10:21:41.120 回答