c# - 将 List<MyObject> 转换为 IEnumerable<MyInterface>

标签 c# list casting ienumerable

我仍在学习一些 C# 内容,但我找不到这个问题的答案。假设我有一个实现 MyInterface 的 MyObject 列表

public class MyObject : IMyInterface { ...}

public List<MyObject> MyObjectList;

如何返回 IEnumerable<IMyInterface>与 MyObjectList 的内容?

我的意思是,现在我有这个:

List<IMyInterface> temp = new List<IMyInterface>();
foreach (MyObject obj in MyObjects) temp.Add(obj);
return (IEnumerable<IMyInterface>)temp;

但是有必要像这样创建一个新列表吗?

谢谢。

最佳答案

如果您使用的是 .NET 3.5,最简单的方法是:

return MyObjects.Cast<IMyInterface>();

您不需要创建所有内容的副本 - 但在 C# 4 推出其通用接口(interface)差异之前,您将不得不做这样的事情。

如果您仍在使用 .NET 2.0,您可以轻松执行类似的操作:

public static IEnumerable<TResult> SafeCast<TSource, TResult>
    (IEnumerable<TSource> source) where TResult : TSource
{
    foreach (TSource item in source)
    {
        yield return item;
    }
}

(请注意,这不会检查 source 是否为 null;要正确执行此操作,由于迭代器 block 的延迟执行,您需要两个方法。)

然后使用:

return SafeCast<MyObject, IMyInterface>(MyObjects);

可以使其更像 LINQ 版本,如下所示:

public static IEnumerable<T> SafeCast<T>(IEnumerable source)
{
    foreach (T item in source)
    {
        yield return item;
    }
}

return SafeCast<IMyInterface>(MyObjects);

这具有编译时安全性 - 它不会阻止您尝试转换 List<string>进入IEnumerable<Guid>例如。

关于c# - 将 List<MyObject> 转换为 IEnumerable<MyInterface>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050457/

相关文章:

c# - 使用 XDocument 遍历节点的所有属性

python - 每十个元素从列表中获取两个连续元素

Django - Tables2 的字典列表

java - 将多条记录添加到 List<List<Object>>

c++ - 将模板类型名转换为 uint64

c# - 创建通用扩展方法来获取值的显示名称属性字符串列表

C# CSCore 在用户停止说话时停止录音

java修剪通用数组

Swift - 如何将 swift 数组转换为 NSArray?

c# - Xamarin : AVPlayer Closing automatically on iOS 13