2013-03-06 26 views
19

私は一般的にforeachループを使用してDictionaryを反復処理します。forループを使用して辞書を反復する

​​

この場合、空白のエントリをトリミングしたいが、foreachループはこれを許可しない。

foreach (var kvp in dictSummary) 
{ 
    kvp.Value = kvp.Value.Trim();  
} 

forループでこれを行うにはどうすればよいですか?

for (int i = dictSummary.Count - 1; i >= 0; i--) 
{ 
} 
+0

が重複する可能性:[C#で辞書を反復処理するための最良の方法は何?](http://stackoverflow.com/questions/141088/what -in-the-best-way-to-a-c-dictionary-in-c) – publicgk

+3

またはこれ;)http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09

+1

@ Belial09あなたが投稿したリンクで尋ねられた質問では、キーが変更されていないようです。ちょうど値。 – joce

答えて

14

KeyValuePair<TKey, TValue>あなたはValueを設定することはできません、それは不変です。

あなたはこのようにそれを行う必要があります:

foreach(var kvp in dictSummary.ToArray()) 
    dictSummary[kvp.Key] = kvp.Value.Trim(); 

ここで重要な部分はToArrayです。辞書を配列にコピーするので、foreach内の辞書を変更してもInvalidOperationExceptionは投げられません。これについて

dictSummary = dictSummary.ToDictionary(x => x.Key, x => x.Value.Trim()); 
32

何:

別のアプローチは、LINQのToDictionaryメソッドを使用するのでしょうか?

for (int i = dictSummary.Count - 1; i >= 0; i--) { 
    var item = dictSummary.ElementAt(i); 
    var itemKey = item.Key; 
    var itemValue = item.Value; 
} 
+5

そのようなコードを使用することは可能ですが、私はそれをお勧めしません。 'Enumerable.ElementAt'は辞書内の要素にアクセスするための最良の方法ではありません... Dictionaryは要素を位置によってアクセスすることを許可していないので、あなたのコードはO(n^2)です。 –

+1

なぜあなたは終わりから始めに反復していますか?パフォーマンスの理由からだと教えてください... – DHN

+0

@AlexeiLevenkov ...ありがとう。私はこれについて知らなかった。ちょうどその問題を検索し、それは大きな欠点のように見えます。再度、感謝します。 –

3

あなたは.ToArray()または.ElementAt()を使用する必要はありません。それはキーで辞書にアクセスするのと同じくらい簡単です:

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim()); 
関連する問題