Bản đồ Java tương đương trong C #


150

Tôi đang cố gắng giữ một danh sách các mục trong bộ sưu tập với chìa khóa do tôi chọn. Trong Java, tôi chỉ đơn giản là sử dụng Bản đồ như sau:

class Test {
  Map<Integer,String> entities;

  public String getEntity(Integer code) {
    return this.entities.get(code);
  }
}

Có cách nào tương đương để làm điều này trong C # không? System.Collections.Generic.Hashsetkhông sử dụng hàm băm và tôi không thể định nghĩa khóa loại tùy chỉnh System.Collections.Hashtablekhông phải là lớp chung
System.Collections.Generic.Dictionarykhông có get(Key)phương thức

Câu trả lời:


181

Bạn có thể lập chỉ mục Từ điển, bạn không cần 'lấy'.

Dictionary<string,string> example = new Dictionary<string,string>();
...
example.Add("hello","world");
...
Console.Writeline(example["hello"]);

Một cách hiệu quả để kiểm tra / nhận giá trị là TryGetValue(thanx đến Earwicker):

if (otherExample.TryGetValue("key", out value))
{
    otherExample["key"] = value + 1;
}

Với phương pháp này, bạn có thể nhanh chóng và không có giá trị ngoại lệ (nếu có).

Tài nguyên:

Từ điển khóa

Thử nhận giá trị


14
Có thể muốn đề cập đến TryGetValue là tốt.
Daniel Earwicker

Nó có O(lg(n))giống Java không? Tôi nghĩ là không

1
@Desolator Đọc là O (1), xem phần Nhận xét của Từ điển <TKey, TValue> trang MSDN
canton7

17

Từ điển <,> là tương đương. Mặc dù nó không có phương thức Get (...), nhưng nó có một thuộc tính được lập chỉ mục gọi là Item mà bạn có thể truy cập trực tiếp trong C # bằng cách sử dụng ký hiệu chỉ mục:

class Test {
  Dictionary<int,String> entities;

  public String getEntity(int code) {
    return this.entities[code];
  }
}

Nếu bạn muốn sử dụng một loại khóa tùy chỉnh thì bạn nên xem xét triển khai IEquitable <> và ghi đè Equals (object) và GetHashCode () trừ khi sự bằng nhau mặc định (tham chiếu hoặc struct) là đủ để xác định sự bằng nhau của các khóa. Bạn cũng nên biến loại khóa của mình thành bất biến để ngăn chặn những điều kỳ lạ xảy ra nếu một khóa bị đột biến sau khi nó được đưa vào từ điển (ví dụ vì đột biến khiến mã băm của nó thay đổi).


10
class Test
{
    Dictionary<int, string> entities;

    public string GetEntity(int code)
    {
        // java's get method returns null when the key has no mapping
        // so we'll do the same

        string val;
        if (entities.TryGetValue(code, out val))
            return val;
        else
            return null;
    }
}

5
Câu trả lời này đã cũ một cách lố bịch, nhưng bạn chỉ có thể trả về giá trị bất kể kết quả của TryGetValue, vì valsẽ được chỉ định null(nghĩa là default(string)) nếu khóa không tồn tại.
dlev
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.