use*_*890 14 .net c# covariance contravariance .net-2.0
给出以下类型:
public interface IMyClass { }
public class MyClass : IMyClass { }
Run Code Online (Sandbox Code Playgroud)
我想知道如何将a转换List<MyClass>为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;
}
....
Run Code Online (Sandbox Code Playgroud)
你怎么能以更优雅/高效的方式解决它?
(请注意,我需要.NET 2.0解决方案,但为了完整性,我很高兴看到使用更新框架版本的更优雅的解决方案.)
Jon*_*eet 21
最简单的方法可能是使用ConvertAll:
List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);
Run Code Online (Sandbox Code Playgroud)
即使您使用的是.NET 2,如果您使用的是VS2008或更高版本,也可以使用lambda语法.否则,总会有匿名方法:
List<IMyClass> converted = original.ConvertAll<IMyClass>(
delegate (MyClass x) { return x; });
Run Code Online (Sandbox Code Playgroud)
在.NET 3.5中,你可以使用LINQ Cast,OfType甚至只使用Select:
var converted = original.Cast<IMyClass>().ToList();
var converted = original.OfType<IMyClass>().ToList();
var converted = original.Select(x => (IMyClass) x).ToList();
Run Code Online (Sandbox Code Playgroud)
在.NET 4.0中,您可以ToList直接使用而无需中间转换,因为协方差IEnumerable<T>:
var converted = original.ToList<IMyClass>();
Run Code Online (Sandbox Code Playgroud)