选角名单- 协方差/逆变问题

发布于 2024-10-16 12:57:52 字数 618 浏览 1 评论 0原文

给定以下类型:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅听莫相离 2024-10-23 12:57:52

最简单的方法可能是使用 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 与 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 中,您由于 IEnumerable 的协方差,可以直接使用 ToList 而无需中间转换:

var converted = original.ToList<IMyClass>();

The simplest way is probably to use ConvertAll:

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

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:

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

In .NET 3.5 you could use LINQ with Cast, OfType or even just Select:

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

In .NET 4.0 you can use ToList directly without an intermediate cast, due to the covariance of IEnumerable<T>:

var converted = original.ToList<IMyClass>();
坐在坟头思考人生 2024-10-23 12:57:52

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

 public IEnumerable<IMyClass> ConvertItems(List<MyClass> input)
 {
    foreach (var item in input)
    {
        yield return (IMyClass)item;
    }
 } 

Does it need to be a list? An IEnumerable solution could be more efficient:

 public IEnumerable<IMyClass> ConvertItems(List<MyClass> input)
 {
    foreach (var item in input)
    {
        yield return (IMyClass)item;
    }
 } 
爱格式化 2024-10-23 12:57:52

(.NET 3.5 解决方案)

List<MyClass> list = new List<MyClass> { ... };
List<IMyClass> converted = list.Cast<IMyClass>().ToList();

(.NET 3.5 solution)

List<MyClass> list = new List<MyClass> { ... };
List<IMyClass> converted = list.Cast<IMyClass>().ToList();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文