Как вернуть IEnumerable <T>для одного элемента - PullRequest
2 голосов
/ 14 марта 2012

У меня есть функция, которая может возвращать список элементов или один элемент, как показано ниже (псевдокод)

IEnumerable<T> getItems()
{
    if ( someCondition.Which.Yields.One.Item )
    {
        List<T> rc = new List<T>();
        rc.Add(MyRC);

        foreach(var i in rc)
            yield return rc;
    }
    else
    {
        foreach(var i in myList)
            yield return i;
    }
}

1-ая часть кажется немного запутанной, чтобы сделать ее читабельной

Ответы [ 5 ]

9 голосов
/ 14 марта 2012
IEnumerable<T> getItems()
{
    if ( someCondition.Which.Yields.One.Item )
    {
        yield return MyRC;
    }
    else
    {
        foreach(var i in myList)
            yield return i;
    }
}
6 голосов
/ 14 марта 2012

Непонятно, что вам нужно использовать блок итератора. Вам нужно / хотите отложить исполнение? Вам нужно / хотите оценивать условие несколько раз, если вызывающая сторона повторяет возвращенную последовательность несколько раз? Если нет, просто используйте:

IEnumerable<T> GetItems()
{
    if (someCondition.Which.Yields.One.Item)
    {
        return Enumerable.Repeat(MyRC, 1);
    }
    else
    {
        // You *could* just return myList, but
        // that would allow callers to mess with it.
        return myList.Select(x => x);
    }
}
6 голосов
/ 14 марта 2012

Вам не нужно ничего делать:

yield return MyRC;

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

Но если это IEnumerable<IList<T>>, тогда все по-другому. Просто верните это:

yield return new[] { singleItem };

или, если это IEnumerable<List<T>>, тогда

yield return new List<T> { singleItem };
4 голосов
/ 14 марта 2012

List<T> не требуется.Ключевое слово yield существует по причине.

IEnumerable<T> getItems(){
    if ( someCondition.Which.Yields.One.Item )
    {
        yield return MyRC;
    }
   else
    {
        foreach(var i in myList)
            yield return i;
    }
}
2 голосов
/ 14 марта 2012

А как же:

 IEnumerable<T> getItems(){ 
    if ( someCondition.Which.Yields.One.Item ) 
    { 
        yield return MyRC; 
    } 
    else 
    { 
        foreach(var i in myList) 
           yield return i; 
    } 
...