2012-11-11 47 views
5

Tôi muốn tạo ra một từ điển của các loại sau đây,Tạo ba cấp độ từ điển lồng nhau trong C#

var data = new Dictionary<string, Dictionary<string, Dictionary<string, int>>>(); 

khi tôi cố gắng thêm giá trị vào từ điển theo cách sau, tôi nhận được một ngoại lệ KeyNotFound.

data[key1][key2][key3]= 3; 

Tôi đang làm gì sai ở đây? Tôi giả định nếu một khóa không được tìm thấy trong một từ điển, nó sẽ tự động được thêm vào nó.

nếu không Có cách nào để thêm khóa vào thời gian chạy không?

Tôi hy vọng sản lượng của loại hình sau:

[male,[animal,[legs,4] 

       [eyes,2]] 
     [human,[hands,2] 
       [ears,2]] 

[female,[animal,[nose,1] 

       [eyes,2]] 
     [bird,[wings,2] 
       [legs,2]] 
+1

Mặc dù không có lý do kỹ thuật do tại sao bạn can'd làm điều này. Tôi rất khuyên bạn nên chống lại việc giữ một cấu trúc dữ liệu như thế này trong bất cứ điều gì bạn phải duy trì. Chia nhỏ những gì bạn đang cố gắng để đại diện cho các lớp học và điều này sẽ dễ dàng hơn để duy trì. Tôi hiểu điều này có vẻ dễ dàng nhưng bạn không có ý nghĩa ngữ nghĩa như những gì mỗi khóa và giá trị đại diện và điều đó sẽ khiến bạn đau đầu. –

Trả lời

6

Vấn đề ở đây là bạn đang chỉ cố gắng để gán vào từ điển trong cùng. Nhưng hai cấp độ bên ngoài không tồn tại.

Bạn cần phải rõ ràng về từng cấp:

if (!data.ContainsKey(key1)) 
    data[key1] = new Dictionary<string, Dictionary<string, int>(); 

... và vân vân. Nó có thể hơi cồng kềnh để viết, vì vậy nếu bạn cần nó rất nhiều, tôi đề nghị bạn tạo một phương pháp mở rộng trên từ điển cho phép bạn làm điều này một cách dễ dàng.

Nếu bạn gán cho một khóa trong từ điển, mục nhập đó sẽ được tạo. Nhưng nếu bạn đọc từ khóa trong từ điển và khóa đó không tồn tại, bạn sẽ nhận được ngoại lệ.

+0

+1! Tôi không biết rằng việc gán một khóa sẽ tự động tạo một mục nhập! – GETah

0

bạn khai báo chỉ có 1 từ điển mức, khi bạn cần phải khai báo mọi cấp độ:

var data = new Dictionary<string, new Dictionary<string, new Dictionary<string, int>>>(); 

Hy vọng điều này sẽ giúp bạn.

0

Bạn đang cố gán chỉ giá trị cấp bên trong. Bạn phải gán cho tất cả các cấp.

Hãy thử điều này:

data["male"] = new[] { 
       {"animal", new[] { 
           {"legs",4}, 
           {"eyes", 2} 
          }, 
       {"human", new[] { 
          {"hands", 2} 
       } 
       }; 

Tôi không có một trình biên dịch ở đây, vì vậy, tôi không chắc chắn nó sẽ làm việc.

2

Tùy thuộc vào phân phối chìa khóa của bạn và số lượng các mục nó có thể được dễ dàng hơn để sử dụng một Tuple<string, string, string> như chính:

var data = new Dictionary<Tuple<string, string, string>, int>(); 
data[Tuple.Create("key1", "key2", "key3")] = 1; 
var itemFromDictionary = data[Tuple.Create("key1", "key2", "key3")]; 
Các vấn đề liên quan