Как вернуть коллекцию IEnumerable <T>, если есть один выход - PullRequest
3 голосов
/ 11 июля 2011

Какой самый умный способ использовать оператор return в блоке итератора вместо foreach, если я хочу вернуть коллекцию ввода?

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Боюсь, это все, что вы можете сделать в блоке итератора.В F # нет эквивалента yield! или идеи yield foreach.К сожалению, но так оно и есть: (

Конечно, вы могли бы избежать использования блока итератора во-первых:

public IEnumerable<Class> Filter(IEnumerable<Class> collection)
{
   return someCondition ? collection : Enumerable.Repeat(new Class(2), 1);
}

Или если у вас более сложная логика:

public IEnumerable<Class> Filter(IEnumerable<Class> collection)
{
   return someCondition ? collection : FilterImpl(collection);
}

private IEnumerable<Class> FilterImpl(IEnumerable<Class> collection)
{
    yield return new Class(2);
    yield return new Class(1);
    // etc
}
0 голосов
/ 13 июля 2011

В этом случае я бы, вероятно, сделал:

public IEnumerable<T> Filter(IEnumerable<T> collection)
{
   if (someCondition)
   {
       return collection
   }
   return new [] {new T()};
}

В более сложных случаях, когда некоторые коллекции необязательно включены в возвращаемое значение, я использую Union.

...