选角名单- 协方差/逆变问题
给定以下类型:
public interface IMyClass { }
public class MyClass : IMyClass { }
我想知道如何将 List
转换为 List
?我对协变/逆变主题并不完全清楚,但我知道我不能直接简单地投射列表。
我只能想出这个简单的解决方案;缺乏任何优雅,浪费资源:
...
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 解决方案,但为了完整性,我很高兴看到使用更新的框架版本的更优雅的解决方案。)
Given the following types:
public interface IMyClass { }
public class MyClass : IMyClass { }
I wonder how can I convert a List<MyClass>
to a List<IMyClass>
? I am not completely clear on the covariance/contravariance topics, but I understand that I cannot just plainly cast the List because of that.
I could come up with this trivial solution only; lacking any elegance, wasting resources:
...
public List<IMyClass> ConvertItems(List<MyClass> input)
{
var result = new List<IMyClass>(input.Count);
foreach (var item in input)
{
result.Add(item);
}
return result;
}
....
How can you solve it in a more elegant/performant way?
(Please, mind that I need .NET 2.0 solution, but for completeness, I would be happy to see the more elegant solutions using newer framework versions, too.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
最简单的方法可能是使用
ConvertAll
:即使您'在使用 .NET 2 时,如果您使用的是 VS2008 或更高版本,则可以使用 lambda 语法。否则,总会有匿名方法:
在 .NET 3.5 中,您可以将 LINQ 与
Cast
、OfType
甚至只是Select
一起使用:在 .NET 4.0 中,您由于
IEnumerable
的协方差,可以直接使用ToList
而无需中间转换:The simplest way is probably to use
ConvertAll
:Even if you're using .NET 2, you can use lambda syntax if you're using VS2008 or higher. Otherwise, there's always anonymous methods:
In .NET 3.5 you could use LINQ with
Cast
,OfType
or even justSelect
:In .NET 4.0 you can use
ToList
directly without an intermediate cast, due to the covariance ofIEnumerable<T>
:它需要是一个列表吗?
IEnumerable
解决方案可能会更有效:Does it need to be a list? An
IEnumerable
solution could be more efficient:(.NET 3.5 解决方案)
(.NET 3.5 solution)