2011-01-06 6 views
0
public static void For<T>(this IEnumerable<T> items, Action<T, int> predicate) 
    { 
     using (IEnumerator<T> iterator = items.GetEnumerator()) 
     { 
      int index = 0; 
      while (iterator.MoveNext()) 
      { 
       T item = iterator.Current; 
       predicate(item, index); 
       index++; 
      } 
     } 
    } 

私はリストを列挙し、forループのようなコレクションのインデックスを使ってアクションを実行するlinq拡張で取り入れています。Forループを置き換えるカスタムLinq拡張子

あなたはこの

items.For((item, index) => item.Prop = item.Prop != MyMethod(index) ? MyMethod(index) : item.Prop); 

のような方法を使用することができ、これは右のように見えるのか?

+0

をあなたがループしながら、2を使用しているのはなぜ?あなたが2番目のループに来るまでにiterator.MoveNext()は常に偽になるでしょう... –

+0

私は自分のコードを編集しました。私は例としてskipwhileを使用していました。 – Steve

+2

おそらく 'Action'の名前を他のものに '述語'を付ける。 C#の「述語」は、具体的には、真または偽を返すメソッドを意味します。これは真理値テストです。上記のコードでは、 '述語'は 'T'のインスタンスと' IEnumerable 'のその項目のインデックスを取るアクションとして使用されています。ただ普通の 'Action action'がより適切かもしれません。 – matt

答えて

2

これを試してみてください:

public static void For<T>(this IEnumerable<T> items, Action<T, int> predicate) 
{ 
    int i=0; 
    foreach (T item in items) 
    { 
     predicate(item, i++); 
    } 
} 
+2

それはかなりきれいに思えます。買います。 – Steve

+0

1つの行に複数の副作用があると、スタイルが悪くなり、ポストインクリメント(C-eraトリックと見なすもの)でコードを不必要に難読化します。 * iをインクリメントし、どの値を述語に渡すかを*明示的にする行を追加するだけです。 –

+1

これは私には分かりませんが、混乱はどこにありますか? – BrokenGlass

関連する問題