사전에 새 항목을 추가하거나 기존 항목을 업데이트하는 방법
일부 레거시 코드에서 키가 이미있는 경우 새 키 값 항목을 추가하거나 값을 업데이트하는 데 도움이되는 다음 확장 방법을 보았습니다.
방법 -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 버전에서 제거 되었습니까?
사용자가 동일한 키-값을 다시 전송하는 경우이 메소드의 목표는 예외를 던지지 않습니다. 메소드는 새 값으로 항목을 업데이트하고 새 키-값 쌍이 메소드에 전송 된 경우 새 항목을 작성해야합니다. .
방법 1을 방법 2로 바꾸면 문제가 있습니까?
아니요, 그냥 사용하십시오 map[key] = value
. 두 옵션은 동일합니다.
에 대해서는 Dictionary<>
대 Hashtable
: 당신이 반사경을 시작하면, 당신은 두 클래스의 인덱서 세터 전화 것을 볼 this.Insert(key, value, add: false);
과 add
매개 변수가 중복 키를 삽입 할 때, 예외를 throw 할 책임이있다. 따라서 동작은 두 클래스에서 동일합니다.
문제 없다. CreateNewOrUpdateExisting
소스에서 소스를 제거하고 map[key] = value
코드에서 직접 사용할 수도 있습니다. 개발자가 일반적으로 map[key] = value
의미를 알기 때문에 훨씬 읽기 쉽습니다 .
오래된 질문이지만 .net 4.0이 질문이 작성된 시점에 이미 시작되었으므로 다음을 추가해야한다고 생각합니다.
.net 4.0부터 System.Collections.Concurrent
스레드 안전 컬렉션이 포함 된 네임 스페이스 가 있습니다.
컬렉션 System.Collections.Concurrent.ConcurrentDictionary<>
은 원하는 것을 정확하게 수행합니다. AddOrUpdate()
스레드 안전이라는 추가 이점 이있는 방법이 있습니다.
고성능 시나리오에 있고 여러 스레드를 처리하지 않으면 이미 주어진 답변 map[key] = value
이 더 빠릅니다.
대부분의 시나리오에서이 성능 이점은 중요하지 않습니다. 그렇다면 ConcurrentDictionary를 사용하는 것이 좋습니다.
- 그것은 프레임 워크에 있습니다-더 테스트되었으며 코드를 유지 관리 해야하는 사람이 아닙니다.
- 확장 가능 : 멀티 스레딩으로 전환하면 이미 준비된 코드
기능적으로는 동일합니다.
map[key] = value
두 개가 아닌 단일 조회 만 수행하므로 성능 이 더 빠릅니다.
스타일면에서는 짧을수록 좋습니다. :)
대부분의 경우 코드는 멀티 스레드 컨텍스트에서 제대로 작동하는 것 같습니다. 그러나 추가 동기화 가 없으면 스레드로부터 안전하지 않습니다 .
참고 URL : https://stackoverflow.com/questions/4245064/method-to-add-new-or-update-existing-item-in-dictionary
'IT story' 카테고리의 다른 글
왜 #include하지 않아야합니까 (0) | 2020.05.09 |
---|---|
Javascript를 사용하여 div의 HTML에서 pdf 생성 (0) | 2020.05.09 |
소스 파일 끝에 빈 줄을 두는 것이 왜 권장됩니까? (0) | 2020.05.09 |
온 클릭 함수에서 문자열 매개 변수 전달 (0) | 2020.05.08 |
Mockito를 사용하여 추상 클래스 테스트 (0) | 2020.05.08 |