2009-06-11 34 views
21

Ai đó có thể chỉ cho tôi một số ví dụ mã C# hoặc cung cấp một số mã, trong đó một từ điển đã được sử dụng làm tài sản cho một lớp..NET Dictionary là một tài sản

Ví dụ tôi đã thấy cho đến nay không bao gồm tất cả các khía cạnh viz cách khai báo từ điển là thuộc tính, thêm, xóa và truy xuất các phần tử từ từ điển.

Trả lời

32

Dưới đây là một ví dụ nhanh

class Example { 
    private Dictionary<int,string> _map; 
    public Dictionary<int,string> Map { get { return _map; } } 
    public Example() { _map = new Dictionary<int,string>(); } 
} 

Một số trường hợp sử dụng

var e = new Example(); 
e.Map[42] = "The Answer"; 
+0

Đúng vậy "42" là câu trả lời "Câu hỏi cuối cùng về cuộc sống, vũ trụ và mọi thứ". – Equiman

16

mẫu mã: sử dụng

public class MyClass 
{ 
    public MyClass() 
    { 
    TheDictionary = new Dictionary<int, string>(); 
    } 

    // private setter so no-one can change the dictionary itself 
    // so create it in the constructor 
    public IDictionary<int, string> TheDictionary { get; private set; } 
} 

mẫu:

MyClass mc = new MyClass(); 

mc.TheDictionary.Add(1, "one"); 
mc.TheDictionary.Add(2, "two"); 
mc.TheDictionary.Add(3, "three"); 

Console.WriteLine(mc.TheDictionary[2]); 
+4

tôi sẽ xem xét để lộ các tài sản như IDictionary chứ không phải là cả lớp. –

+0

ok, đã thay đổi thuộc tính –

1

Một ví dụ ...

public class Example 
{ 
    public Dictionary<Int32, String> DictionaryProperty 
    { 
     get; set; 
    } 

    public Example() 
    { 
     DictionaryProperty = new Dictionary<int, string>(); 
    } 
} 

public class MainForm 
{ 
    public MainForm() 
    { 
     Example e = new Example(); 

     e.DictionaryProperty.Add(1, "Hello"); 
     e.DictionaryProperty.Remove(1); 
    } 
} 
10

Bạn cũng có thể nhìn vào indexers. (Chính thức MSDN tài liệu here)

class MyClass 
{ 
    private Dictionary<string, string> data = new Dictionary<string, string>(); 

    public MyClass() 
    { 
     data.Add("Turing, Alan", "Alan Mathison Turing, OBE, FRS (pronounced /ˈtjʊ(ə)rɪŋ/) (23 June, 1912 – 7 June, 1954) was a British mathematician, logician, cryptanalyst and computer scientist.") 
     //Courtesy of [Wikipedia][3]. Used without permission 
    } 

    public string this [string index] 
    { 
     get 
     { 
      return data[index]; 
     } 
    } 
} 

Sau đó, một khi bạn đã cư điển trong nội bộ, bạn có thể truy cập nó thông tin bằng cách

MyClass myExample = new MyClass(); 

string turingBio = myExample["Turing, Alan"]; 

EDIT

Rõ ràng, điều này đã được được sử dụng cẩn thận, bởi vì MyClass KHÔNG phải là từ điển và bạn không thể sử dụng bất kỳ phương pháp từ điển nào trên đó trừ khi bạn triển khai chúng cho lớp trình bao bọc. Nhưng những người lập chỉ mục là một công cụ tuyệt vời trong những tình huống nhất định.

2

Một ví dụ khác của việc sử dụng một từ điển như một thuộc tính tĩnh với chỉ get accessor:

private static Dictionary <string, string> dict = new Dictionary <string,string>(){    
      {"Design Matrix", "Design Case"}, 
      {"N/A", "Other"} 
    }; 


    public static Dictionary <string, string> Dict 
    { 
     get { return dict} 
    }   

Cấu trúc này có thể được sử dụng để thay thế các giá trị.

4

Để đảm bảo đóng gói chính xác và không thể cập nhật từ điển bên ngoài lớp bằng cách sử dụng Thêm hoặc mẫu ExampleDictionary [1] = "test", sử dụng IReadOnlyDictionary.

public class Example 
{ 
    private Dictionary<int, string> exampleDictionary; 

    public Example() 
    { 
     exampleDictionary = new Dictionary<int, string>(); 
    } 

    public IReadOnlyDictionary<int, string> ExampleDictionary 
    { 
     get { return (IReadOnlyDictionary<int, string>)exampleDictionary; } 
    } 
} 

Đoạn mã dưới đây sẽ không làm việc, mà không phải là trường hợp nếu IDictionary được sử dụng:

var example = new Example(); 
example.ExampleDictionary[1] = test; 
+0

Tôi biết OP (loại) đã làm cho nó rõ ràng rằng ông muốn tài sản để có các chức năng của IDictionary, nhưng tôi đã không biết IReadOnlyDictionary và cần nó.+1 –

+0

Một diễn viên đơn giản để 'IReadOnlyDictionary' là không đủ nếu bạn thực sự muốn ngăn chặn sửa đổi nội dung của từ điển, một diễn viên đơn giản trở lại từ điển sẽ cho phép sửa đổi nó. Bạn nên bọc từ điển vào một ReadOnlyDictionary và trả về trình bao bọc. – marapet

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