Список приведения к IEnumerable
Я все еще изучаю некоторые из этих вещей c#, и я не мог найти ответ на этот вопрос. Предположим, что у меня есть список MyObject, реализующих MyInterface
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;
Но нужно ли создавать такой новый список?
Спасибо.
3 ответов:
Если вы используете .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; } }(обратите внимание, что это не проверяет наличие
sourcenull; чтобы сделать это правильно, вам понадобятся два метода из-за отложенного выполнения итератора блоки.)Затем используйте:
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>, например.
Здесь хорошо работает методLINQ Cast , что-то вроде MyObjects.Cast ()
Если вы используете C# 3 и .NET 3.5 (или выше), то вы можете использовать предложение LINQ, представленное Джейком:
return MyObjectList.Cast<IMyInterface>();(в данном конкретном случае нет необходимости в
AsEnumerable)Однако, если вы используете предыдущую версию (2.0 C# и .NET или выше), вы все еще можете использовать блок итератора:
foreach(MyObject obj in MyObjectList) yield return (IMyInterface)obj;
Comments