2011-07-11 8 views
3

入力コレクションを返す場合は、foreachではなくiteratorブロックでreturnステートメントを使用する最もスマートな方法は何ですか?返す方法IEnumerable <T>コレクションが1つの場合は

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(); 
} 
+0

私はそれが単なるサンプルコードであることを知っていますが、実際には変数の名前として 'class'を使うべきではありません。 – grapkulec

答えて

3

これは、イテレータブロック内で行うことができます。 F#にはyield!、またはyield foreachというアイデアはありません。それは残念だが、それはそれはもちろん

は、あなたが最初の場所でイテレータブロックを使用して避けることができ:(ある方法です:

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 
} 

public IEnumerable<Class> Filter(IEnumerable<Class> collection) 
{ 
    return someCondition ? collection : Enumerable.Repeat(new Class(2), 1); 
} 

をそれとも、より複雑なロジックを持っている場合この場合

0

、私はおそらくだろう:

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

より複雑なケースでは、どこ一部collectio nsはオプションで戻り値に含まれ、私はUnionを使用します。

関連する問題