읽기 전용 필드이기 때문에 항목의 값을 수정하려고 할 때 문제가 발생했습니다.
KeyValuePair<Tkey, Tvalue>
다음과 같은 다른 대안을 시도했습니다.
Dictionary<Tkey, Tvalue>
하지만 거기에도 같은 문제가 있습니다. 값 필드를 새 값으로 설정하는 방법이 있습니까?
답변:
KeyValuePair는 변경할 수 없습니다.
namespace System.Collections.Generic
{
[Serializable]
public struct KeyValuePair<TKey, TValue>
{
public KeyValuePair(TKey key, TValue value);
public TKey Key { get; }
public TValue Value { get; }
public override string ToString();
}
}
KeyValuePair에 업데이트하려는 기존 값이있는 경우 기존 값을 제거한 다음 수정 된 값을 추가 할 수 있습니다.
예를 들어 :
var list = new List<KeyValuePair<string, int>>();
list.Add(new KeyValuePair<string, int>("Cat", 1));
list.Add(new KeyValuePair<string, int>("Dog", 2));
list.Add(new KeyValuePair<string, int>("Rabbit", 4));
int removalStatus = list.RemoveAll(x => x.Key == "Rabbit");
if (removalStatus == 1)
{
list.Add(new KeyValuePair<string, int>("Rabbit", 5));
}
는 KeyValuePair<TKey, TValue>C #에 구조체 및 구조체 치형 불변으로 언급된다. 그 이유는 분명합니다 Dictionary<TKey,TValue>. 고성능 데이터 구조 여야합니다. 값 유형 대신 참조 유형을 사용하면 너무 많은 메모리 오버 헤드가 사용됩니다. 사전에 직접 저장된 값 유형과 달리 사전의 각 항목에 대한 32 비트 또는 64 비트 참조가 할당됩니다. 이러한 참조는 항목 인스턴스에 대한 힙을 가리 킵니다. 전반적인 성능이 빠르게 저하됩니다.
다음을 Dictionary<TKey,TValue>충족 하는 클래스보다 구조체를 선택하는 Microsoft 규칙 :
✔️ 유형의 인스턴스가 작고 일반적으로 수명이 짧거나 일반적으로 다른 개체에 포함 된 경우 클래스 대신 구조체를 정의하는 것을 고려하십시오.
❌ 유형에 다음 특성이 모두없는 경우 구조체 정의를 피하십시오.
Dictionary<long, int> _rowItems = new Dictionary<long, int>();
_rowItems.Where(x => x.Value > 1).ToList().ForEach(x => { _rowItems[x.Key] = x.Value - 1; });
사전의 경우 일부 조건에 따라 이러한 방식으로 값을 업데이트 할 수 있습니다.