KeyValuePair 값을 수정하는 방법은 무엇입니까? 때문에 항목의 값을 수정하려고 할

읽기 전용 필드이기 때문에 항목의 값을 수정하려고 할 때 문제가 발생했습니다.

KeyValuePair<Tkey, Tvalue>

다음과 같은 다른 대안을 시도했습니다.

Dictionary<Tkey, Tvalue>

하지만 거기에도 같은 문제가 있습니다. 값 필드를 새 값으로 설정하는 방법이 있습니까?



답변

수정할 수 없으며 새 것으로 바꿀 수 있습니다.

var newEntry = new KeyValuePair<Tkey, Tvalue>(oldEntry.Key, newValue);

또는 사전 :

dictionary[oldEntry.Key] = newValue;


답변

여기에서 KeyValuePair를 변경 가능하게 만들려면.

맞춤 수업을 만드세요.

public class KeyVal<Key, Val>
{
    public Key Id { get; set; }
    public Val Text { get; set; }

    public KeyVal() { }

    public KeyVal(Key key, Val val)
    {
        this.Id = key;
        this.Text = val;
    }
}

KeyValuePair 어디에서나 사용할 수 있습니다.


답변

KeyValuePair<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 규칙 :

✔️ 유형의 인스턴스가 작고 일반적으로 수명이 짧거나 일반적으로 다른 개체에 포함 된 경우 클래스 대신 구조체를 정의하는 것을 고려하십시오.

❌ 유형에 다음 특성이 모두없는 경우 구조체 정의를 피하십시오.

  • 기본 유형 (int, double 등)과 유사한 단일 값을 논리적으로 나타냅니다.
  • 인스턴스 크기가 16 바이트 미만입니다.
  • 불변입니다.
  • 자주 박스에 넣을 필요는 없습니다.


답변

KeyValuePair는 수정할 수 없지만 다음과 같이 사전 값을 수정할 수 있습니다.

foreach (KeyValuePair<String, int> entry in dict.ToList())
{
    dict[entry.Key] = entry.Value + 1;
}

또는 다음과 같이 :

foreach (String entry in dict.Keys.ToList())
{
    dict[entry] = dict[entry] + 1;
};


답변

Dictionary<long, int> _rowItems = new Dictionary<long, int>();
  _rowItems.Where(x => x.Value > 1).ToList().ForEach(x => { _rowItems[x.Key] = x.Value - 1; });

사전의 경우 일부 조건에 따라 이러한 방식으로 값을 업데이트 할 수 있습니다.