2016-04-27 13 views
3

からのデータを変更し、私はこのアルター/既存keyValuePair

foreach (KeyValuePair<string, Object> tempData in tempList.ToDictionary(x => x.Key, y => y.Value)) 
{   
    tempData["fahrzeugA"] = "s"; 
} 

を持っている。しかしtempData["fahrzeugA"] = "s";が動作しません使用します。

は私が取得:

型の式に[]でインデックスを適用することはできません 「System.Collections.Generic.KeyValuePair」私が持っている場合は、正しい構文で何

既存のキーfahrzeugA、私は変更したいですか?

+1

「ToDictionary」は新しいオブジェクトを返します。このようにtempListを変更することはできません。 – qxg

+1

'tempList'に格納されている型は何ですか? KeyValuePair? –

+1

何をしようとしていますか?キー "fahrzeugA"を持つ 'tempList'の項目を変更しますか? –

答えて

2

あなたは、これを適用することができます。

var tempList = new List<Test>(); 
var dic = tempList.ToDictionary(x => x.Key, y => y.Value); 
foreach (var tempData in dic) 
{ 
     dic[tempData.Key] = "s"; 
} 
+2

私はOPがやろうとしていることが分かりません。たぶん彼は 'tempList'の項目を、それらの要素のコピーを含む独立した辞書でなく変更したいと思っています。 –

+0

どのような用途ですか?なぜ値セレクタで '' s "'を選択しないのですか? –

+0

多分、彼は辞書の価値を変えます。 –

0

tempListを辞書に変換できたら、すべてのキーが一意でなければならないため、1つの「fahrzeugA」しか存在しないので、ループは意味をなさない。

あなただけ言うことができるはず

var dictionary = tempList.ToDictionary(x => x.Key, y => y.Value); 
dictionary["fahrzeugA"] = "s"; 

あなたが最初の場所で辞書を作成したくない場合は、あなたがこれを行うことができます:あなたが使用している場合は

var matchingKeyValuePair = tempList.SingleOrDefault(x => x.Key == "fahrzeugA"); 
if (matchingKeyValuePair != null) matchingKeyValuePair.Value = "s"; 

を変更可能な構造体である.NET KeyValuePair<TKey, TValue>のリストは、次のように値を新しいKeyValuePairに置き換えることができます。

var matchingIndex = tempList.FindIndex(x => x.Key == "fahrzeugA"); 
if (matchingIndex >= 0) 
    tempList[matchingIndex] = new KeyValuePair<string, string>("fahrzeugA", "s"); 

注:これは、「fahrzeugA」というキーを持つアイテムが1つしかないことを前提としています。

+1

私はこれがOPがやろうとしていることではないのですか?完全に独立した辞書ではなく、 'tempList'の値を変更しようと考えました。 –

+0

@Verarind、私は私の答えを更新しました。 – devuxer

+1

実際に 'KeyValuePair'(http://stackoverflow.com/questions/13454721/how-to-modify-a-keyvaluepair-value)を変更できますか? –

1

不変の構造体であるため、キー値のペアを変更することはできません。変更する唯一の方法は、新しいインスタンスを作成することです。そのインスタンスは辞書から独立しています。

ディクショナリの値を変更する場合は、ディクショナリのindexerプロパティを使用して値を変更します。

それでも、辞書はすぐに有効範囲外になるので、それを使用する設定はありません。元のリストには影響しません。

0

をごtempListList<KeyValuePair<string, Object>>タイプの場合:

for (var i = 0; i < tempList.Count; ++i) { 
    if (tempList[i].Key == "fahrzeugA") { 
     tempList[i] = new KeyValuePair<string, object> ("fahrzeugA", "s"); // KeyValuePair<string, object> might be changed with your own type if you use something else. 
     break; // If you want to modify only first KeyValuePair. 
    } 
} 
+1

これは 'tempList'に' KeyValuePair'型の項目が含まれている場合にのみ有効です。しかし、これは最初にtempListを変更する答えです。 –

+0

@Vera rind本当です。 'Key'と' Value'要素を持つ他の型の場合、 'new KeyValuePair 'は他の型の初期化で変更する必要があります。 –

0
  1. チェックKeyValuePair.Value Property。読み取り専用であり、変更することはできません。
  2. ToDictionaryは新しいオブジェクトを作成します。要素の値にアクセスすることで元のオブジェクトを変更することはできません。
  3. 元のリストからこの特定のアイテムを削除し、同じキーの新しいアイテムを追加する必要があります。

    var removeIndex = tempList.FindIndex(kp => kp.Key == "fahrzeugA"); 
    tempList.RemoveAt(removeIndex); 
    tempList.Add(new KeyValuePair<string, string>("fahrzeugA", "s")); 
    

    複数の「fahrzeugA」の項目は、(それが辞書に有効なリストでは有効ではないです)がある場合は、代わりにRemoveAllを使用しています。

関連する問題