[英]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 作為單獨的集合訪問鍵和值特性。
ICollection
和IDictionary
都是無序的,這意味着盡管您可以使用CopyTo
方法或 foreach 循環以某種順序檢索元素,但該順序沒有特殊意義,並且可能會無緣無故地更改。 這是ICollection
和IList
之間的主要區別:列表允許您將項目放在特定位置,就像數組一樣,並且它們會一直留在那里直到您移動它們。
List<>
和Dictionary<,>
- 用於不同目的的完全不同的數據結構,List 只是一組項目,而 Dictionary 是一組鍵值對。
當您擁有一組復雜對象並希望通過讓我們說 ObjectName/ObjectId 進行快速訪問時,Dictionary 非常有用,在這種情況下,您創建IDictionary<string, TObject>
其中 key 將是 ObjectId 而 Value 將是一個對象本身。
一些差異:
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.