Phương pháp để thêm mới hoặc cập nhật mục hiện có trong Từ điển


235

Trong một số mã kế thừa, tôi đã thấy phương thức mở rộng sau đây để tạo điều kiện thêm một mục giá trị khóa mới hoặc cập nhật giá trị, nếu khóa đã tồn tại.

Phương pháp-1 (mã kế thừa).

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

Mặc dù, tôi đã kiểm tra map[key]=value chính xác công việc đó. Đó là, phương pháp này có thể được thay thế bằng Phương pháp-2 dưới đây.

Phương pháp-2.

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

Bây giờ, câu hỏi của tôi là .. Có thể có bất kỳ vấn đề gì nếu tôi thay thế Phương thức 1 bằng Phương pháp-2 không? Nó sẽ phá vỡ trong bất kỳ kịch bản có thể?

Ngoài ra, tôi nghĩ điều này từng là sự khác biệt giữa HashTable và Dictionary. HashTable cho phép cập nhật một mục hoặc thêm một mục mới bằng cách sử dụng trình chỉ mục trong khi Từ điển thì không !! Sự khác biệt này đã được loại bỏ trong các phiên bản C #> 3.0?

Mục tiêu của phương thức này không phải là ngoại lệ nếu người dùng gửi lại cùng một giá trị khóa, phương thức chỉ cần cập nhật mục nhập với giá trị mới và tạo một mục nhập mới nếu cặp giá trị khóa mới được gửi đến phương thức .

Câu trả lời:


243

Có thể có bất kỳ vấn đề gì nếu tôi thay thế Phương thức 1 bằng Phương pháp 2 không?

Không, chỉ cần sử dụng map[key] = value. Hai tùy chọn là tương đương.


Về Dictionary<>so với Hashtable: Khi bạn khởi động Reflector, bạn sẽ thấy rằng các bộ chỉ mục của cả hai lớp gọi this.Insert(key, value, add: false);addtham số chịu trách nhiệm ném một ngoại lệ, khi chèn một khóa trùng lặp. Vì vậy, hành vi là như nhau cho cả hai lớp.


44

Không có vấn đề gì. Tôi thậm chí sẽ loại bỏ CreateNewOrUpdateExistingkhỏi nguồn và sử dụng map[key] = valuetrực tiếp trong mã của bạn, bởi vì điều này dễ đọc hơn nhiều, bởi vì các nhà phát triển thường sẽ biết ý map[key] = valuenghĩa của nó.


22

Câu hỏi cũ nhưng tôi cảm thấy tôi nên thêm phần sau, thậm chí nhiều hơn vì .net 4.0 đã được đưa ra tại thời điểm câu hỏi được viết.

Bắt đầu với .net 4.0, có không gian tên System.Collections.Concurrentbao gồm các bộ sưu tập an toàn theo luồng.

Bộ sưu tập System.Collections.Concurrent.ConcurrentDictionary<>làm chính xác những gì bạn muốn. Nó có AddOrUpdate()phương pháp với ưu điểm bổ sung là an toàn luồng.

Nếu bạn đang ở trong một kịch bản hiệu suất cao và không xử lý nhiều luồng, các câu trả lời đã được đưa ra map[key] = valuesẽ nhanh hơn.

Trong hầu hết các kịch bản, lợi ích hiệu suất này là không đáng kể. Nếu vậy tôi khuyên bạn nên sử dụng Đồng thời Từ điển vì:

  1. Nó nằm trong khuôn khổ - Nó được thử nghiệm nhiều hơn và bạn không phải là người phải duy trì mã
  2. Nó có thể mở rộng: nếu bạn chuyển sang đa luồng thì mã của bạn đã được chuẩn bị cho nó

7

Về mặt chức năng, chúng là tương đương.

Hiệu suất-khôn ngoan map[key] = valuesẽ nhanh hơn, vì bạn chỉ thực hiện tra cứu duy nhất thay vì hai.

Phong cách khôn ngoan, càng ngắn càng tốt :)

Mã trong hầu hết các trường hợp dường như hoạt động tốt trong bối cảnh đa luồng. Tuy nhiên, nó không an toàn cho chủ đề mà không cần đồng bộ hóa thêm.

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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.