【问题标题】:How to return IEnumerable<T> for a single item如何为单个项目返回 IEnumerable<T>
【发布时间】:2012-03-14 13:25:34
【问题描述】:

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

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

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

【问题讨论】:

  • 卡住试图选择正确的答案,有什么想法吗?

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


【解决方案1】:
IEnumerable<T> getItems()
{
    if ( someCondition.Which.Yields.One.Item )
    {
        yield return MyRC;
    }
    else
    {
        foreach(var i in myList)
            yield return i;
    }
}

【讨论】:

    【解决方案2】:

    你不需要做任何事情:

    yield return MyRC;
    

    您通常会一个接一个地返回项目,而不是分组到一个集合中。

    但如果是IEnumerable&lt;IList&lt;T&gt;&gt;,那就不一样了。只需返回:

    yield return new[] { singleItem };
    

    或者如果是IEnumerable&lt;List&lt;T&gt;&gt; 那么

    yield return new List<T> { singleItem };
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • myList 是带有 office com Interop 的 func 的占位符,它返回 poco,因此必须在那里使用 yield return !对此有什么想法吗? stackoverflow.com/questions/9696115/…
      • @Kumar:你为什么不直接建立列表呢?再说一遍 - 你需要延迟执行吗?
      • 不,不需要延迟执行,但需要能够处理大量带有附件的邮件数据,这些附件一次处理一个因此产量,并且肯定需要清理 com 引用
      • @Kumar:听起来你确实需要延迟执行,如果你一次只需要处理一个......
      【解决方案4】:

      List&lt;T&gt; 是不必要的。 yield 关键字的存在是有原因的。

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

      【讨论】:

      • 嗯,yield return myRC 之前没用,现在可以了!我猜是深夜!
      【解决方案5】:

      怎么样:

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

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 2023-03-31
        • 2012-02-28
        相关资源
        最近更新 更多