2011-10-27 40 views
13

Tôi có một nghi ngờ kỳ lạ liên quan đến danh sách và từ điển trong C#sự khác biệt giữa danh sách <> và từ điển <> trong C# là gì

Trong một danh sách chúng tôi thêm các mục vào danh sách bằng cách sử dụng các phương pháp sau đây

using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     List<int> list = new List<int>(); 
     list.Add(2); 
     list.Add(3); 
     list.Add(5); 
     list.Add(7); 
    } 
} 

trong một cuốn từ điển chúng ta thêm các mục như thế này ...

using System; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     Dictionary<string, int> d = new Dictionary<string, int>(); 
     d.Add("cat", 2); 
     d.Add("dog", 1); 
     d.Add("llama", 0); 
     d.Add("iguana", -1); 
    } 
} 

tôi không biết sự khác biệt là chính xác những gì, nhưng trong một cuốn từ điển chúng ta thêm các mục như một (key, value) cặp và trong một danh sách chúng tôi chỉ cần thêm mặt hàng withou t chỉ định bất kỳ khóa nào ..

Có ai làm rõ điều này không?

+11

Câu hỏi của bạn là khá tự giải thích ;-) – Seb

Trả lời

25

IDictionary là dành cho các bản đồ giá trị ->ICollection dành cho các bộ đối tượng tương tự.

ICollection là giao diện cho các bộ sưu tập các đối tượng tương tự: các điều khiển trên biểu mẫu, các phần tử trong danh sách, thuộc tính trong thẻ XML, v.v. Kể từ .NET 2.0, có một phiên bản chung, vì vậy bạn có thể tham khảo tập hợp các số nguyên là ICollection<int>.

IDictionary là giao diện để ánh xạ một loại đối tượng hoặc giá trị khác. Nó hoạt động giống như từ điển thực, hoặc danh bạ điện thoại: bạn có một "chìa khóa" trong đầu như tên của một người và khi bạn tra cứu, bạn sẽ nhận được một số thông tin được xác định bằng khóa đó, như địa chỉ hoặc số điện thoại. Mỗi khóa chỉ có thể được liệt kê một lần, mặc dù hai khóa khác nhau vẫn được phép có cùng giá trị. Đây cũng là chung trong .NET 2.0, do đó, một từ điển có khóa là chuỗi và giá trị của nó là số nguyên sẽ là IDictionary<string,int>.

Từ điển thực sự là tập hợp các cặp khóa/giá trị: bạn có thể sử dụng IDictionary<int,string> làm ICollection<KeyValuePair<int,string>> và bạn có thể truy cập khóa và giá trị dưới dạng bộ sưu tập riêng biệt với thuộc tính Khóa và giá trị.

Cả hai ICollectionIDictionary không có thứ tự, nghĩa là mặc dù bạn có thể truy xuất các phần tử theo thứ tự với phương pháp CopyTo hoặc vòng lặp foreach, thứ tự này không có lý do rõ ràng. Đó là sự khác biệt chính giữa ICollectionIList: danh sách cho phép bạn đặt các mục ở các vị trí cụ thể, giống như một mảng và chúng ở đó cho đến khi bạn di chuyển chúng.

+0

thanq .. nhưng bạn sẽ pls giải thích với một ví dụ mẫu .... – rockyashkumar

+0

kiểm tra dưới đây 2 liên kết cho ví dụ: http://www.dotnetperls.com/từ điển http://www.dotnetperls.com/list – SShebly

+0

Bất kỳ sự khác biệt hiệu suất? –

6
  • Dictionary<K,V> là mảng liên kết hoặc bản đồ. Đó là một vùng chứa có thể được lập chỉ mục theo các giá trị thuộc bất kỳ loại nào.
  • List<T> là mảng được lập chỉ mục số nguyên. Nó là một container được lập chỉ mục bởi các số nguyên kề nhau.

Sự khác biệt cơ bản do đó là cách các vùng chứa được lập chỉ mục.

Đừng rơi vào bẫy tin rằng Dictionary<int,T> là ngữ nghĩa tương đương với List<T>. Sự khác biệt là việc lập chỉ mục của List<T> là tiếp giáp trong khi có thể có khoảng trống trong việc lập chỉ mục cho Dictionary<int,T>.

8

List<>Dictionary<,> - cấu trúc dữ liệu khá khác nhau được sử dụng cho các mục đích khác nhau, Danh sách chỉ đơn giản là một tập hợp các mục và Từ điển là tập hợp các cặp khóa-giá trị.

Từ điển khá hữu ích khi bạn có một bộ đối tượng phức tạp và muốn truy cập nhanh bằng cách giả sử ObjectName/ObjectId, trong trường hợp này bạn tạo IDictionary<string, TObject> trong đó khóa sẽ là ObjectId và Value sẽ là một đối tượng.

Một số khác biệt:

  • Danh sách kiên trì trật tự của các mục, từ điển không
  • Danh sách cho phép của chỉ số truy cập nhanh
  • Danh sách hỗ trợ xây dựng trong thuật toán Sắp xếp nhanh cho dữ liệu nhanh chóng sắp xếp
  • từ điển cho phép ~ O(1) độ phức tạp về thời gian để truy cập một mục (giá trị) bằng một khóa
0

Tôi có một thư viện lớp mà truy cập vào một loạt các sprocs T-sql; mỗi sproc trả về một hàng duy nhất nhưng các cột khác nhau. Tôi cần một giải pháp dùng chung cho một lấy các giá trị và từ điển <> cung cấp một giải pháp sạch hơn nhiều so với Danh sách <>.

Lớp chung cho tất cả các giấy gói tuyên bố

public Dictionary<string, String> datadict = new Dictionary<string, string>(); 

public Dictionary<string, String> LoadData(string sproc, string paramName, string paramValue) 

Gọi một Reader, các datadict được nạp với

for (int i = Reader.FieldCount; i != 0; i--) 
{ 
    datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim()); 
} 

và trả datadict để kêu gọi lớp mà sau đó có thể truy xuất dữ liệu giống như Reader; Ví dụ:

datadict = myData.LoadData("spGetSSN", "", ""); 
    ssn1 = datadict["SSN1"]; 
    ssn2 = datadict["SSN2"]; 
    ssn3 = datadict["SSN3"]; 

Sạch hơn đối với tôi là Danh sách <>.

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