Làm cách nào để sửa đổi giá trị KeyValuePair?


81

Tôi gặp sự cố khi cố gắng sửa đổi giá trị của một mục vì nó chỉ là trường chỉ đọc.

KeyValuePair<Tkey, Tvalue>

Tôi đã thử các lựa chọn thay thế khác nhau như:

Dictionary<Tkey, Tvalue>

nhưng ở đó tôi có cùng một vấn đề. Có cách nào để đặt trường giá trị thành giá trị mới không?


Bạn đang cố gắng cập nhật một giá trị cụ thể hay tất cả / hầu hết các giá trị trong nhóm?
— J0HN 19/11/12

Tôi cố gắng cập nhật một giá trị cụ thể.
— Kimbo

Câu trả lời:


122

Bạn không thể sửa đổi nó, bạn có thể thay thế nó bằng một cái mới.

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

hoặc cho từ điển:

dictionary[oldEntry.Key] = newValue;

Cảm ơn bạn đã giúp đỡ. Phần với từ điển chính là thứ tôi cần.
— Kimbo

13

Tại đây, nếu bạn muốn biến KeyValuePair có thể thay đổi.

Tạo một lớp tùy chỉnh.

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

vì vậy chúng tôi có thể sử dụng nó ở bất cứ đâu trong KeyValuePair.


9

KeyValuePair<TKey, TValue>là bất biến. Bạn cần tạo một khóa mới với khóa hoặc giá trị đã được sửa đổi. Những gì bạn thực sự làm tiếp theo phụ thuộc vào kịch bản của bạn và chính xác những gì bạn muốn làm ...


Tôi có thể sửa đổi KeyValuePair <>. Đừng bao giờ đánh giá thấp P / Invoke.
— Joshua

1

KeyValuePair là bất biến,

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

Nếu bạn có bất kỳ giá trị hiện có nào trong KeyValuePair mà bạn muốn cập nhật, thì Bạn có thể thử xóa giá trị hiện có rồi thêm giá trị đã sửa đổi

Ví dụ:

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

Là KeyValuePair<TKey, TValue>một struct và struct trong C # là kiểu giá trị và được đề cập là bất biến. Lý do là rõ ràng, Dictionary<TKey,TValue>phải là một cấu trúc dữ liệu hiệu suất cao. Sử dụng kiểu tham chiếu thay vì kiểu giá trị sẽ sử dụng quá nhiều chi phí bộ nhớ. Không giống như kiểu giá trị được lưu trữ trực tiếp trong từ điển, ngoài ra, các tham chiếu 32 bit hoặc 64 bit cho mỗi mục nhập trong từ điển sẽ được cấp phát. Các tham chiếu này sẽ được trỏ tới heap cho trường hợp mục nhập. Hiệu suất tổng thể sẽ giảm nhanh chóng.

Các quy tắc của Microsoft để chọn cấu trúc trên lớp Dictionary<TKey,TValue>đáp ứng:

✔️ CONSIDER xác định một cấu trúc thay vì một lớp nếu các thể hiện của kiểu này nhỏ và thường tồn tại trong thời gian ngắn hoặc thường được nhúng vào các đối tượng khác.

❌ TRÁNH xác định một cấu trúc trừ khi kiểu có tất cả các đặc điểm sau:

  • Nó đại diện một cách hợp lý cho một giá trị duy nhất, tương tự như các kiểu nguyên thủy (int, double, v.v.).
  • Nó có kích thước phiên bản dưới 16 byte.
  • Nó là bất biến.
  • Nó sẽ không phải được đóng hộp thường xuyên.

0

Bạn không thể sửa đổi KeyValuePair, nhưng bạn có thể sửa đổi các giá trị từ điển của mình như sau:

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

hoặc như thế này:

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

Đối với Từ điển, chúng tôi có thể cập nhật các giá trị theo cách này dựa trên một số điều kiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.