如果有一个yield,如何返回IEnumerable<T>集合

3

如果我想返回输入的集合,那么在迭代器块中使用return语句而不是foreach循环的最聪明的方法是什么?

public IEnumerable<T> Filter(IEnumerable<T> collection)
{
   if (someCondition)
   {
       // return collection; - cannot be used because of "yield" bellow
       foreach (T obj in collection)
       {
          yield return obj;
       } 
       yield break;
   }
   yield return new T();
}

我知道这只是一个示例代码,但你真的不应该将“class”用作变量名 :) - grapkulec
2个回答

3

很遗憾,在迭代器块中,您只能做这些。在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
在这种情况下,我可能会执行以下操作:
public IEnumerable<T> Filter(IEnumerable<T> collection)
{
   if (someCondition)
   {
       return collection
   }
   return new [] {new T()};
}

在更复杂的情况下,当一些集合是可选包含在返回值中时,我使用 Union

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接