我还在学习这些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;
但是有必要创建一个这样的新列表吗?
谢谢。
答案 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;