C #에서 Dictionary에 저장된 값을 업데이트하는 방법은 무엇입니까?


455

사전에서 특정 키의 값을 업데이트하는 방법은 Dictionary<string, int>무엇입니까?


사전에 값으로 저장된 복잡한 유형이 있습니다. 저장된 값의 속성을 변경하려고하면 CS1612가 나타납니다. 따라서 나는 길을 가야한다 : var v = dict [c]; v.dprop = c.sprop; dict [c] = v;
peter70

답변:


762

주어진 키에서 사전을 가리키고 새로운 값을 지정하십시오.

myDictionary[myKey] = myNewValue;

따라서이 간단한 방법은 값을 변경할 필요없이 잘 알려진 ".Add"및 ".TryGetValue"방법을 대체하는 것이 좋습니다. (?) 적어도 키를 덮어 쓰는 것이 중요하지 않은 경우, 예를 들어 루프에서 키를 두 번 이상 쓰는 것이 배제되지 않는 상황에서. 아니면 누군가 단점이 있습니까? 특히 .Add는 if-wrapper 또는 TryGetValue를 잊어 버린 경우 동일한 키에 대해 .Add가 두 번 호출되는 테스트 및 다른 테스트 데이터에서 제대로 작동 할 수 있다는 초보자에게 큰 위험이 있기 때문에 예외가 발생합니다.
Philm

1
이 작업의 흥미로운 점은 사전에 UPSERT (키, 값)입니다. 훌륭한!
Soren

1
Pini가 언급했듯이 이것이 질문에 대한 답변이어야합니다. 옳은 일 때문에 바꾸십시오.
레오 Gurdian

190

인덱스로 키에 액세스하면 가능합니다

예를 들면 다음과 같습니다.

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary["test"] = 1;
dictionary["test"] += 1;
Console.WriteLine (dictionary["test"]); // will print 2

11
목록에 "test"항목이 없으면 list [ "test"] = list [ "test"] + 1; KeyNotFoundException이 발생합니다! 기존 인덱서가 아닌 순수한 할당이 작동합니다. list [ "test"] = 1;
Steven Spyrka

list [ "test"] ++;를 사용할 수 있습니까?
aufty

17
사전 목록을 부르지
말고

1
@aufty ++dictionary["test"];또는 dictionary["test"]++;키 값이 "test"인 사전에 항목이있는 경우에만 쓸 수 있습니다 ( 예 : if(dictionary.ContainsKey("test")) ++dictionary["test"]; else dictionary["test"] = 1; // create entry with key "test"
gerryLowry

46

이 접근법을 따를 수 있습니다 :

void addOrUpdate(Dictionary<int, int> dic, int key, int newValue)
{
    int val;
    if (dic.TryGetValue(key, out val))
    {
        // yay, value exists!
        dic[key] = val + newValue;
    }
    else
    {
        // darn, lets add the value
        dic.Add(key, newValue);
    }
}

여기에 도달하는 가장자리는 사전에 한 번의 액세스로 해당 키의 값을 확인하고 얻는 것입니다. ContainsKey존재를 확인하고 를 사용 하여 값을 업데이트하는 데 사용 dic[key] = val + newValue;하면 사전에 두 번 액세스합니다.


4
대신 dic.Add(key, newValue);use를 사용할 수 있습니다 dic[key] = newvalue;.
Macke

"dic [key] = value"를 수행하고 "key"가 없으면 어떻게됩니까?
superpuccio

1
@superpuccio 당신은 KeyNotFoundException을 얻을
ntroncos

8
@ntroncos는 true가 아니며 제공된 키를 사용하여 해당 키를 사전에 추가합니다. + = 존재하지 않는 키에서는 작동하지 않습니다. dic [key] = value + dic [key]의 구문 설탕이기 때문입니다.
lastas

2
사전에 추가하는 것이 아니라 사전을 업데이트하는 것과 관련하여 질문에 대한 답변이어야합니다.
외로운 코더

15

LINQ : Access를 사용하여 키 사전을 만들고 값을 변경하십시오.

Dictionary<string, int> dict = new Dictionary<string, int>();
dict = dict.ToDictionary(kvp => kvp.Key, kvp => kvp.Value + 1);

나는 이것이 어떻게 작동하는지 이해하지 못하지만 놀랍습니다.
육각형

1
다른 사전을 만드는 것은 그런 간단한 일에 의미가 없습니다. ccalboni의 답변을 확인하십시오.
RollerCosta

1
나는 그것이 좋은 대답이라고 생각합니다. 각 문자열을 알 필요가 없습니다
Joseph Wu

9

키가 foo[x] = 9어디에 x있고 9가 값인 것처럼 인덱스로 업데이트하는 방법은 다음과 같습니다.

var views = new Dictionary<string, bool>();

foreach (var g in grantMasks)
{
    string m = g.ToString();
    for (int i = 0; i <= m.Length; i++)
    {
        views[views.ElementAt(i).Key] = m[i].Equals('1') ? true : false;
    }
}

13
m [i] .Equals ( '1')은 이미 bool로 평가되므로? 사실 : 거짓이 필요하지 않습니다
린든 데르 선박 밴

이 논리가 얼마나 효율적인지 모르겠지만 For 루프 아이디어가 마음에 듭니다. :)
개방 및 무료

2
  1. 업데이트 -존재 만 수정합니다. 인덱서 사용의 부작용을 피하려면 다음을 수행하십시오.

    int val;
    if (dic.TryGetValue(key, out val))
    {
        // key exist
        dic[key] = val;
    }
  2. 업데이트 또는 ( 값이 dic에 없으면 새로 추가 )

    dic[key] = val;

    예를 들어 :

    d["Two"] = 2; // adds to dictionary because "two" not already present
    d["Two"] = 22; // updates dictionary because "two" is now present

1

이것은 당신을 위해 일할 수 있습니다 :

시나리오 1 : 기본 유형

string keyToMatchInDict = "x";
int newValToAdd = 1;
Dictionary<string,int> dictToUpdate = new Dictionary<string,int>{"x",1};

if(!dictToUpdate.ContainsKey(keyToMatchInDict))
   dictToUpdate.Add(keyToMatchInDict ,newValToAdd );
else
   dictToUpdate[keyToMatchInDict] = newValToAdd; //or you can do operations such as ...dictToUpdate[keyToMatchInDict] += newValToAdd;

시나리오 2 : 값으로 목록에 사용한 접근 방식

int keyToMatch = 1;
AnyObject objInValueListToAdd = new AnyObject("something for the Ctor")
Dictionary<int,List<AnyObject> dictToUpdate = new Dictionary<int,List<AnyObject>(); //imagine this dict got initialized before with valid Keys and Values...

if(!dictToUpdate.ContainsKey(keyToMatch))
   dictToUpdate.Add(keyToMatch,new List<AnyObject>{objInValueListToAdd});
else
   dictToUpdate[keyToMatch] = objInValueListToAdd;

도움이 필요한 사람에게 유용하기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.