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

时间:2011-07-11 05:19:10

标签: c# .net ienumerable ienumerator

如果我想返回输入集合,在迭代器块中使用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();
}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

在这种情况下,我可能会这样做:

public IEnumerable<T> Filter(IEnumerable<T> collection)
{
   if (someCondition)
   {
       return collection
   }
   return new [] {new T()};
}

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