Список приведения к 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;
Но нужно ли создавать такой новый список?

Спасибо.

118   3  

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;
    }
}

(обратите внимание, что это не проверяет наличие source null; чтобы сделать это правильно, вам понадобятся два метода из-за отложенного выполнения итератора блоки.)

Затем используйте:

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;
    Ничего не найдено.

Добавить ответ:
Отменить.