2009-03-26 43 views
140

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

class Test { 
    Map<Integer,String> entities; 

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

Có cách nào tương tự để thực hiện việc này trong C# không? System.Collections.Generic.Hashset không sử dụng băm và tôi không thể định nghĩa một kiểu tùy chỉnh quan trọng System.Collections.Hashtable không phải là một lớp chung
System.Collections.Generic.Dictionary không có một phương pháp get(Key)

Trả lời

165

Bạn có thể chỉ số từ điển, bạn không cần 'get' .

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 các giá trị là TryGetValue (thanx cho 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à ngoại lệ ít có giá trị (nếu có).

Resources:

Dictionary-Keys

Try Get Value

+14

Có thể muốn đề cập đến TryGetValue. –

+0

Có phải 'O (lg (n))' giống Java không? Tôi nghĩ rằng không phải là –

+1

@Desolator Reads là O (1), hãy xem phần Ghi chú trong trang MSDN của Từ điển của – canton7

17

điển <,> là tương đương. Trong khi nó không có một Nhận (...) phương pháp, nó không có một tài sản được lập chỉ mục gọi là mục mà bạn có thể truy cập bằng C# trực tiếp sử dụng ký hiệu chỉ số:

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 kiểu tùy chỉnh quan trọng thì bạn nên xem xét việc triển khai IEquatable <> và ghi đè Equals (đối tượng) và GetHashCode() trừ khi sự bình đẳng (tham chiếu hoặc cấu trúc) mặc định là đủ để xác định sự bình đẳng của các khóa. Bạn cũng nên làm cho loại khóa không thay đổi để ngăn những điều kỳ lạ xảy ra nếu khóa bị đột biến sau khi được chèn vào từ điển (ví dụ: vì đột biến đã làm cho 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 rất lố bịch, nhưng bạn có thể trả về giá trị bất kể kết quả của 'TryGetValue', vì 'val' sẽ được gán' null' (tức là 'mặc định (chuỗi)') nếu khóa không tồn tại. – dlev

Các vấn đề liên quan