如何返回IEnumerable<;T>;对于单个项目

本文关键字:gt 于单个 项目 何返回 lt 返回 IEnumerable | 更新日期: 2023-09-27 18:27:58

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

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

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

如何返回IEnumerable<;T>;对于单个项目

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

您不需要做任何事情:

yield return MyRC;

您通常逐个返回项目,而不是在集合中分组。

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

yield return new[] { singleItem };

或者如果是IEnumerable<List<T>>,则

yield return new List<T> { singleItem };

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

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

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

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

关于:

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