2010-12-08 6 views
3

辞書の値を変更するにはどうすればよいですか?私はこのように私の辞書にループしながら、私の辞書に値に値を再割り当てする:ループ中に辞書の値を変更する方法

dtParamsは私 Dictionary

ある

for (int i = 0; i < dtParams.Count; i++) 
{ 
    dtParams.Values.ElementAt(i).Replace("'", "''"); 
} 

私はこのようないくつかのことやりたい:

string a = "car";  
a = a.Replace("r","t"); 
+0

可能重複[辞書を反復処理し、値を変更するには?](http://stackoverflow.com/questions/2260446/how-to-iterate-through-dictionary-and-change-values) – SwDevMan81

+0

それらは似ていますが、同じではありません,,,そして、辞書を繰り返して値を変更する方法の解決策? –

答えて

8

文字列Replace関数は、新しい変更された文字列を返します。したがって、次のようにする必要があります。

foreach (var key in dtParams.Keys.ToArray()) 
{ 
    dtParams[key] = dtParams[key].Replace("'", "''"); 
} 

EDIT:

コレクションを対処は、あなたが代わる使用する場合、それは新しいを返します問題(私はあなたがすでに存在するキーにアクセスする場合に発生するとは思わなかった...)

+0

例外:: コレクションが変更されました。列挙操作が実行されないことがあります。 –

+1

forループを使用するか、新しいディクショナリを作成して削除する代わりに追加してみてください。 foreachループでコレクションのメンバーを変更することはできません。 – Pabuc

3

修正されます文字列インスタンスの場合、置換後に辞書の値を代入する必要があります。文字列は本来不変であるため、

+0

ええ、私はそれを行う方法を尋ねる.. –

3

これは直接行うことはできません。列挙中にコレクションを変更することはできません(また、ここではElementAtを使用しないでください;これはLINQ to Objects拡張メソッドであり、リスト全体を反復するには効率が悪いです)。

foreach(var key in dtParams.Keys.ToList()) // Calling ToList duplicates the list 
{ 
    dtParams[key] = dtParams[key].Replace("'", "''"); 
} 
+0

も動作しません.. –

+0

@ user418343、何がうまくいかない? –

+0

あなたの解決策... –

1

少しラムダが長くなるでしょう。 ;)

私はこれをLINQPadにドロップし、あなたのためにそれをテストしました。すべてのコレクションには.To [xxx]メソッドがありますので、これを1行で簡単に行うことができます。

var dtParams = new Dictionary<string, string>(); 
dtParams.Add("1", "'"); 
dtParams.Add("a", "a"); 
dtParams.Add("b", "b"); 
dtParams.Add("2", "'"); 
dtParams.Add("c", "c"); 
dtParams.Add("d", "d"); 
dtParams.Add("e", "e"); 
dtParams.Add("3", "'"); 

var stuff = dtParams.ToDictionary(o => o.Key, o => o.Value.Replace("'", "''")); 
stuff.Dump(); 
関連する問題