2009-08-26 11 views
2

私は簡単な質問があります:私はDictionary.Valueコレクションの反復をたくさんやっています。私はtoList()を呼び出すことができます。 Dictionary(Dictionary自体、Keysコレクション、またはValuesコレクション)の列挙可能なコレクションのどれもがForEach拡張メソッドを持っていないようだからです。.NET:ForEach()の拡張メソッドと辞書

ForEach()拡張メソッドがこれらのコレクションに実装されていない、またはMSが重要ではないと感じたことがある理由はありますか?

ディクショナリコレクションを繰り返し処理するのは珍しいことですか?レコードアイデンティティ値をキーとして使用して、データベースから引き出されたデータを格納するときは、リストではなく辞書を使用することがよくあります。私はIdキーで検索していない時間をたくさん認めなければならないが、それは私が入ったばかりの習慣である...

+1

? –

答えて

8

Eric Lippert explains why Microsoft didn't write a ForEach extension method

あなたは1を自分で書くことができます。

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action) { 
    if (sequence == null) throw new ArgumentNullException("sequence"); 
    if (action == null) throw new ArgumentNullException("action"); 
    foreach(T item in sequence) 
     action(item); 
} 

//Return false to stop the loop 
public static void ForEach<T>(this IEnumerable<T> sequence, Func<T, bool> action) { 
    if (sequence == null) throw new ArgumentNullException("sequence"); 
    if (action == null) throw new ArgumentNullException("action"); 

    foreach(T item in sequence) 
     if (!action(item)) 
      return; 
} 
+2

エリックの記事はいくつかの点を強調しています。彼らはあなたの答えを使ってあまりにも狂ってしまう前に、人々がそれを読むことを願っています。 – patridge

+0

エリックはIEnumerableを<> '' '上の一般的なForEach'に対して良好な議論を行いますが、プレーンな' foreach'ループはあなた 'KeyValuePair'を与えるので辞書<>' 'のためにそれはまだ、有利であろうが、ラムダができましたキー用とコード用の2つの引数があり、コードをよりきれいに見せることができます。 – gpvos

1

そこにはない理由はないIEnumerable <T>に実装されているForEach拡張メソッド(代わりにList <T>にのみあります)。私は共通のライブラリにForEach拡張メソッドを作成しましたが、これはほんの数行のコードです。

public static void ForEach<T>(this IEnumerable<T> list, Action<T> action) { 
    foreach(var o in list) { 
     action(o); 
    } 
} 
2

うーん、の答えに私のコメントをアップグレードしましょう、私は読みやすいコードを含めることができます。

エリックはIEnumerable<>に関する一般ForEachに対して良好な議論を行いますが、平野foreachループはあなたにKeyValuePairを与えるのでDictionary<>のために、それはまだ、有利であろうが、ラムダは二つの引数、キー用とのための1つを持っている可能性がありこの値は、コードをよりきれいに見せます。あなただけの拡張子を自分で書いていない理由を

public static void ForEach<TKey, TValue>(this Dictionary<TKey, TValue> dict, Action<TKey, TValue> action) { 
    if (dict == null) throw new ArgumentNullException("dict"); 
    if (action == null) throw new ArgumentNullException("action"); 

    foreach (KeyValuePair<TKey, TValue> item in dict) { 
     action(item.Key, item.Value); 
    } 
}