KeyValuePair मान को कैसे संशोधित किया जाए?


82

मुझे एक समस्या तब हुई जब मैंने एक आइटम के मूल्य को संशोधित करने की कोशिश की क्योंकि इसका केवल एक ही क्षेत्र है।

KeyValuePair<Tkey, Tvalue>

मैंने विभिन्न विकल्पों की कोशिश की है जैसे:

Dictionary<Tkey, Tvalue>

लेकिन वहाँ मैं एक ही समस्या है। क्या मूल्य फ़ील्ड को नए मूल्य पर सेट करने का कोई तरीका है?


क्या आप विशिष्ट मूल्य, या सभी / अधिकांश मूल्यों को डिक्शनरी में अपडेट करने का प्रयास कर रहे हैं?
— J0HN

मैं एक विशिष्ट मूल्य को अपडेट करने की कोशिश करता हूं।
— किम्बो

जवाबों:


126

आप इसे संशोधित नहीं कर सकते, आप इसे एक नए के साथ बदल सकते हैं।

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

या शब्दकोश के लिए:

dictionary[oldEntry.Key] = newValue;

आपकी सहायता के लिए धन्यवाद। शब्दकोश के साथ हिस्सा वास्तव में मैं क्या जरूरत है।
— किम्बो

13

यहाँ, यदि आप 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 में कहीं भी उपयोग कर सकते हैं।


9

KeyValuePair<TKey, TValue>अपरिवर्तनीय है। आपको संशोधित कुंजी या मान के साथ एक नया बनाना होगा। आप वास्तव में आगे क्या करते हैं यह आपके परिदृश्य पर निर्भर करता है, और वास्तव में आप क्या करना चाहते हैं ...


मैं एक KeyValuePair <> को संशोधित कर सकता हूं। कभी भी पी / चालान न करें।
— जोशुआ

1

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));
}

1

KeyValuePair<TKey, TValue>एक struct और सी # में struct मान प्रकार और अपरिवर्तनीय होने के लिए उल्लेख किया है। कारण स्पष्ट है, Dictionary<TKey,TValue>एक उच्च-प्रदर्शन डेटा संरचना होनी चाहिए। मान प्रकार के बजाय संदर्भ प्रकार का उपयोग करना बहुत अधिक मेमोरी ओवरहेड का उपयोग करेगा। एक शब्दकोश में सीधे संग्रहीत मूल्य प्रकार के विपरीत, इसके अलावा शब्दकोश में प्रत्येक प्रविष्टि के लिए 32 बिट या 64 बिट संदर्भ आवंटित किया जाएगा। इन संदर्भों को प्रविष्टि उदाहरण के लिए ढेर करने के लिए इंगित किया जाएगा। कुल मिलाकर प्रदर्शन में तेजी से कमी आएगी।

Microsoft वर्ग पर संरचना चुनने के लिए नियम जो Dictionary<TKey,TValue>संतुष्ट करता है:

✔️ CONSIDER एक वर्ग के बजाय एक संरचना को परिभाषित करता है यदि प्रकार के उदाहरण छोटे और आमतौर पर अल्पकालिक होते हैं या आमतौर पर अन्य वस्तुओं में एम्बेडेड होते हैं।

Has AVOID एक संरचना को परिभाषित करता है जब तक कि प्रकार में निम्नलिखित विशेषताएं न हों:

  • यह तार्किक रूप से आदिम प्रकार (इंट, डबल, आदि) के समान एकल मूल्य का प्रतिनिधित्व करता है।
  • यह 16 बाइट्स के तहत एक उदाहरण आकार है।
  • यह अपरिवर्तनीय है।
  • इसे बार-बार बॉक्सिंग नहीं करना पड़ेगा।

0

आप 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;
};

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

शब्दकोश के लिए हम कुछ स्थितियों के आधार पर इस तरह से मूल्यों को अपडेट कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.