3

入力コレクションを返したい場合、foreachの代わりにイテレータブロックでreturnステートメントを使用する最も賢い方法は何ですか?

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

2 に答える 2

3

残念ながら、反復子ブロック内でできることはこれだけです。yield!F# には に相当するもの、または a の考え方はありません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
}
于 2011-07-11T05:24:04.580 に答える
0

この場合、私はおそらく次のようにします。

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

一部のコレクションがオプションで戻り値に含まれる、より複雑なケースでは、 を使用しますUnion

于 2011-07-13T06:42:23.123 に答える