如何为单个项目返回IEnumerable <t> </t>

时间:2012-03-14 13:25:34

标签: c# .net linq ienumerable yield-return

我有一个函数可以返回项目列表或单个项目如下(伪代码)

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

第一部分似乎有点笨拙,希望使其可读

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

您无需执行任何操作:

yield return MyRC;

您通常会逐个退回商品,而不是分组。

但如果它是IEnumerable<IList<T>>那么它就不同了。只需返回:

yield return new[] { singleItem };

或者如果它是IEnumerable<List<T>>那么

yield return new List<T> { singleItem };

答案 2 :(得分:6)

目前尚不清楚您是否需要首先使用迭代器块。你需要/想要推迟执行吗?如果调用者多次迭代返回的序列,您是否需要/想要多次评估条件?如果没有,请使用:

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

答案 3 :(得分:4)

List<T>是不必要的。 yield关键字存在是有原因的。

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

答案 4 :(得分:2)

怎么样:

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