将List <myobject>转换为IEnumerable <myinterface> </myinterface> </myobject>

时间:2010-01-12 16:26:57

标签: c# list casting ienumerable

我还在学习这些c#的东西,我找不到这个问题的答案。假设我有一个实现MyInterface的MyObject列表

public class MyObject : IMyInterface { ...}

public List<MyObject> MyObjectList;

如何使用MyObjectList的内容返回IEnumerable<IMyInterface>

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

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

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

谢谢。

3 个答案:

答案 0 :(得分:6)

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

return MyObjects.Cast<IMyInterface>();

你不需要创建所有内容的副本 - 但是在C#4出现其通用接口差异之前,你就会像这样做某些事情

如果您仍在使用.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是否为空;为了正确地执行此操作,您需要两个方法,因为迭代器块的延迟执行。)

然后使用:

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>

答案 1 :(得分:0)

使用LINQ Cast方法在这里工作得很好,比如MyObjects.Cast()

答案 2 :(得分:0)

如果您使用的是C#3和.NET 3.5(或更高版本),那么您可以使用Jake提出的LINQ建议:

return MyObjectList.Cast<IMyInterface>();

(在这种特殊情况下不需要AsEnumerable

但是,如果您使用的是先前版本(C#和.NET或更高版本的2.0),您仍然可以使用迭代器块:

foreach(MyObject obj in MyObjectList) yield return (IMyInterface)obj;