사전에 새 항목을 추가하거나 기존 항목을 업데이트하는 방법


235

일부 레거시 코드에서 키가 이미있는 경우 새 키 값 항목을 추가하거나 값을 업데이트하는 데 도움이되는 다음 확장 방법을 보았습니다.

방법 -1 (레거시 코드).

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

그러나 나는 그것이 map[key]=value 똑같은 일을 하는 것을 확인했습니다 . 즉,이 방법은 아래의 방법 2로 대체 될 수 있습니다.

방법 -2.

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

자, 제 질문은 .. Method-1을 Method-2로 바꾸면 문제가 있습니까? 가능한 시나리오에서 중단됩니까?

또한 이것이 HashTable과 Dictionary의 차이점이라고 생각합니다. HashTable을 사용하면 Dictionary가 아닌 항목을 업데이트하거나 인덱서를 사용하여 새 항목을 추가 할 수 있습니다 !! 이 차이는 C #> 3.0 버전에서 제거 되었습니까?

사용자가 동일한 키-값을 다시 전송하는 경우이 메소드의 목표는 예외를 던지지 않습니다. 메소드는 새 값으로 항목을 업데이트하고 새 키-값 쌍이 메소드에 전송 된 경우 새 항목을 작성해야합니다. .

답변:


243

방법 1을 방법 2로 바꾸면 문제가 있습니까?

아니요, 그냥 사용하십시오 map[key] = value. 두 옵션은 동일합니다.


에 대해서는 Dictionary<>Hashtable: 당신이 반사경을 시작하면, 당신은 두 클래스의 인덱서 세터 전화 것을 볼 this.Insert(key, value, add: false);add매개 변수가 중복 키를 삽입 할 때, 예외를 throw 할 책임이있다. 따라서 동작은 두 클래스에서 동일합니다.


44

문제 없다. CreateNewOrUpdateExisting소스에서 소스를 제거하고 map[key] = value코드에서 직접 사용할 수도 있습니다. 개발자가 일반적으로 map[key] = value의미를 알기 때문에 훨씬 읽기 쉽습니다 .


22

오래된 질문이지만 질문이 작성된 시점에서 .net 4.0이 이미 시작되었으므로 다음을 추가해야한다고 생각합니다.

.net 4.0부터는 System.Collections.Concurrent스레드로부터 안전한 컬렉션이 포함 된 네임 스페이스 가 있습니다.

컬렉션 System.Collections.Concurrent.ConcurrentDictionary<>은 원하는 것을 정확하게 수행합니다. AddOrUpdate()스레드 안전이라는 추가 이점 이있는 방법이 있습니다.

고성능 시나리오에 있고 여러 스레드를 처리하지 않으면 이미 주어진 답변 map[key] = value이 더 빠릅니다.

대부분의 시나리오에서이 성능 이점은 중요하지 않습니다. 그렇다면 ConcurrentDictionary를 사용하는 것이 좋습니다.

  1. 그것은 프레임 워크에 있습니다-더 테스트되었으며 코드를 유지 관리 해야하는 사람이 아닙니다.
  2. 확장 가능 : 멀티 스레딩으로 전환하면 이미 준비된 코드

7

기능적으로는 동일합니다.

map[key] = value두 개가 아닌 단일 조회 만 수행하므로 성능 이 더 빠릅니다.

스타일면에서는 짧을수록 좋습니다. :)

대부분의 경우 코드는 멀티 스레드 컨텍스트에서 제대로 작동하는 것 같습니다. 그러나 추가 동기화 가 없으면 스레드로부터 안전하지 않습니다 .

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