2013-06-04 33 views
5

Tôi mới sử dụng C# /. Net và gặp sự cố với Từ điển lớp. Tôi đã tạo một từ điển của các nhóm và thêm một mục (hoặc nhiều mục hơn, bây giờ không quan trọng):Cách truy cập Từ điển <TKey, TValue>. Thuộc tính Item trong C#

Dictionary<int, ListViewGroup> groups = new Dictionary<int, ListViewGroup>(); 
groups.Add(1, new ListViewGroup("Group1")); 

Tôi muốn tìm nhóm của mình bằng khóa của nó. Trong tài liệu, nó nói rằng có một thuộc tính Item mà tôi có thể truy cập trực tiếp hoặc bằng indexer. Tuy nhiên, khi tôi cố gắng truy cập trực tiếp:

ListViewGroup g = groups.Item(1); 

Trình biên dịch của tôi nói rằng không có định nghĩa cho mục thuộc tính trong lớp Từ điển. Có ai có thể giải thích điều này cho tôi không? Cảm ơn bạn.

+0

Pro-tip: Khi bạn gõ dấu chấm '.' và IntelliSense xuất hiện; tất cả các phương thức, biến, thuộc tính, sự kiện, v.v. bạn có thể truy cập sẽ nằm trong danh sách đó. Đó là một cách tuyệt vời để tìm phương pháp bạn đang tìm kiếm, ngay cả khi bạn không biết nó được gọi như thế nào. – Nolonar

+0

@Nolonar: Không phải lúc nào cũng đúng: theo mặc định, tùy chọn intellisense "ẩn thành viên nâng cao", có nghĩa là bạn không nhận được mọi thứ. –

+0

@DanPuzey Tôi hiểu rồi. Cảm ơn cho sự giác ngộ. – Nolonar

Trả lời

9

Item là một indexer, bạn có thể xác minh nó bằng cách nhìn vào định nghĩa:

public TValue this[TKey key] { get; set; } 

Đơn giản chỉ cần sử dụng cú pháp indexer để truy cập các yếu tố bởi chính:

ListViewGroup g = groups[1]; 
Console.WriteLine (g.Header); //prints Group1 

Lưu ý: đây sẽ ném KeyNotFoundException nếu không có mục nhập có khóa như vậy sẽ có trong groups từ điển. Ví dụ: groups[2] sẽ ném một ngoại lệ trong trường hợp của bạn.

3

Sử dụng groups[n].

Nếu bạn nhìn vào the manual cho Dictionary<TKey, TValue>.Item, bạn có thể tìm thấy:

Khách sạn này cung cấp khả năng truy cập vào một yếu tố cụ thể trong bộ sưu tập bằng C# cú pháp sau: myCollection [key] .

Hoặc tìm kiếm trên web cho "C# indexers":

Indexers Tutorial (C#):

Xác định một indexer cho phép bạn tạo các lớp học mà hành động như "mảng ảo." Các trường hợp của lớp đó có thể được truy cập bằng cách sử dụng toán tử truy cập mảng [].

Chỉ mục hoặc Item trong trường hợp này, không bao giờ được truy cập trực tiếp.

+0

Bạn có nghĩa là groups.Item [n]? Bởi vì điều này có cùng một vấn đề. – Wolf

+0

@Wolf không có nó. Nó thực sự giúp nếu bạn hiển thị mã chính xác và lỗi biên dịch chính xác trong câu hỏi của bạn. – CodeCaster

+3

Sử dụng 'Mục' làm tên từ điển trong câu trả lời của bạn rất gây hiểu lầm. –

1

Bạn đang gặp lỗi vì không có thuộc tính nào được gọi là Mục trong lớp từ điển ở cấp cơ sở.

Dictionary<int, ListViewGroup> groups = new Dictionary<int, ListViewGroup>(); 
groups.Add(1, new ListViewGroup("Group1")); 

ListViewGroup g = groups.Item (1);

ListViewGroup g = groups[1]; 

Từ một sự hiểu biết quan điểm thực tế (những gì tôi sắp nói duy nhất là cho sự hiểu biết cơ bản) từ điển là cơ bản một mảng nhưng thay vì bị buộc phải sử dụng số theo thứ tự bạn có thể sử dụng bất kỳ số nào bạn như hoặc thậm chí là một chuỗi.

new Dictionary<int, ListViewGroup> 

Trong từ điển của bạn, bạn có

1 Group1 

nhóm [1] sẽ lấy Group1.

Để thực sự hiểu được tính mát mẻ của từ điển là khi bạn sử dụng khóa chuỗi.

new Dictionary<string, ListViewGroup> 

do đó nếu bạn đã làm điều này

groups.Add("mykey1", new ListViewGroup("Group1")); 

nhóm [ "mykey1"] sẽ lấy Group1

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