簡體   English   中英

c#中的列表<>和字典<>有什么區別

[英]what is the difference between list<> and dictionary<> in c#

我對 C# 中的列表和字典有一個奇怪的疑問

在列表中,我們使用以下方法將項目添加到列表

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);
    }
}

在字典中,我們添加這樣的項目......

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);
   }
}

我不知道到底有什么區別,但是在字典中我們添加了像 (key,value) 對這樣的項目,而在列表中我們只添加了項目而不指定任何鍵..

有人會澄清這一點嗎?

IDictionary用於鍵-> 值映射, ICollection用於相似對象的集合。

ICollection是類似對象集合的接口:表單上的控件、列表中的元素、XML 標記中的屬性等等。 從 .NET 2.0 開始,有一個通用版本,因此您可以將整數集合稱為ICollection<int>

IDictionary 是用於將一種類型的對象或值映射到另一種類型的接口。 它就像一本真正的字典或電話簿:你有一個“鑰匙”,比如一個人的名字,當你查找它時,你會得到一些由該鑰匙識別的信息,比如地址或電話號碼。 每個鍵只能列出一次,盡管仍然允許兩個不同的鍵具有相同的值。 這在 .NET 2.0 中也是通用的,因此鍵為字符串且值為整數的字典將是IDictionary<string,int>

字典實際上是鍵/值對的集合:您可以將IDictionary<int,string>用作ICollection<KeyValuePair<int,string>> ,並且您可以使用 Keys 和 Values 作為單獨的集合訪問鍵和值特性。

ICollectionIDictionary都是無序的,這意味着盡管您可以使用CopyTo方法或 foreach 循環以某種順序檢索元素,但該順序沒有特殊意義,並且可能會無緣無故地更改。 這是ICollectionIList之間的主要區別:列表允許您將項目放在特定位置,就像數組一樣,並且它們會一直留在那里直到您移動它們。

List<>Dictionary<,> - 用於不同目的的完全不同的數據結構,List 只是一組項目,而 Dictionary 是一組鍵值對。

當您擁有一組復雜對象並希望通過讓我們說 ObjectName/ObjectId 進行快速訪問時,Dictionary 非常有用,在這種情況下,您創建IDictionary<string, TObject>其中 key 將是 ObjectId 而 Value 將是一個對象本身。

一些差異:

  • 列出項目的持久順序,字典不
  • 列表允許通過索引快速訪問
  • 列表支持內置 QuickSort 算法,用於快速數據排序
  • 字典允許 ~ O(1)時間復雜度通過鍵訪問項目(值)
  • Dictionary<K,V>是關聯數組或映射。 它是一個可以被任何類型的值索引的容器。
  • List<T>是一個整數索引數組。 它是一個由連續整數索引的容器。

因此,本質的區別在於容器的索引方式。

不要陷入相信Dictionary<int,T>在語義上等同於List<T>的陷阱。 不同之處在於List<T>的索引是連續的,而Dictionary<int,T>的索引可能存在間隙

我有一個訪問各種 T-sql 程序的類庫; 每個 sproc 返回單行但不同的列。 我需要一個通用的解決方案來檢索值,而 Dictionary<> 提供了一個比 List<> 更簡潔的解決方案。

所有包裝器通用的類聲明

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

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

調用 Reader,datadict 被加載

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

並將 datadict 返回給調用類,然后調用類可以像 Reader 一樣檢索數據; 例如:

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

List<> 對我來說更干凈。

列表中的元素具有以下特征:

除非明確重新排序(例如,通過對列表進行排序),否則它們會保持其順序。 它們可以是任何類型,並且類型可以混合。 它們通過數字(從零開始)索引訪問。 字典中的元素具有以下特征:

每個條目都有一個鍵和一個值 不能保證排序 使用鍵值訪問元素 鍵值可以是任何哈希表類型(即不是字典)並且類型可以混合 值可以是任何類型(包括其他字典),並且類型可以混合

列表:在列表中,可以添加重復記錄。

字典:字典中的鍵必須是唯一的。 無法在字典中添加重復鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM