c#中list 和dictionary 有什么区别?
我对c#中的列表和字典有一个奇怪的疑问
在列表中,我们使用以下方法将项目添加到列表中
using System.Collections.Generic; class Program { static void Main() { List list = new List(); list.Add(2); list.Add(3); list.Add(5); list.Add(7); } }
在字典中我们添加这样的项目……
using System; using System.Collections.Generic; class Program { static void Main() { Dictionary d = new Dictionary(); d.Add("cat", 2); d.Add("dog", 1); d.Add("llama", 0); d.Add("iguana", -1); } }
我不确切地知道有什么区别,但是在字典中我们添加像(键,值)对的项目,在列表中我们只添加项目而不指定任何键。
有人会澄清这个吗?
IDictionary
用于键 – >值映射, ICollection
用于类似对象的集合。
ICollection
是类似对象集合的接口:表单上的控件,列表中的元素,XML标记中的属性等。 从.NET 2.0开始,有一个通用版本,因此您可以将整数集合称为ICollection
。
IDictionary是用于将一种类型的对象或值映射到另一种类型的接口。 它就像一本真正的字典或电话簿:你有一个“钥匙”,就像一个人的名字一样,当你查找它时,你会得到一些由该键识别的信息,如地址或电话号码。 每个键只能列出一次,但仍允许两个不同的键具有相同的值。 这在.NET 2.0中也是通用的,因此字符串的键是字符串并且其值是整数的字典将是IDictionary
。
字典实际上是键/值对的集合:您可以使用IDictionary
作为ICollection
,您可以使用Keys和Values将键和值作为单独的集合进行访问属性。
ICollection
和IDictionary
都是无序的,这意味着虽然您可以使用CopyTo
方法或foreach循环以某种顺序检索元素,但该顺序没有特殊含义,并且可能无明显变化。 这是ICollection
和IList
之间的主要区别:列表允许您将项目放在特定位置,就像数组一样,并且它们一直保持在那里直到您移动它们。
List<>
和Dictionary<,>
– 用于不同目的的完全不同的数据结构,List只是一组项,Dictionary是一组键值对。
当你有一组复杂的对象并想要快速访问时,字典非常有用,比如说ObjectName / ObjectId,在这种情况下你创建了IDictionary
,其中key是ObjectId而Value将是一个对象本身。
一些差异:
- 列出项目的持久顺序,字典没有
- 列表允许通过索引快速访问
- 列出QuickSort算法内置的支持,用于快速数据排序
- 字典允许~
O(1)
时间复杂度通过键访问项(值)
-
Dictionary
是关联数组或映射。 它是一个可以通过任何类型的值索引的容器。 -
List
是整数索引数组。 它是一个由连续整数索引的容器。
因此,本质上的区别在于容器的索引方式。
不要陷入相信Dictionary
在语义上等同于List
的陷阱。 不同之处在于List
的索引是连续的,而Dictionary
的索引可能存在间隙 。
我有一个类库,可以访问各种T-sql sprocs; 每个sproc返回一行但不同的列。 我需要一个用于检索值的通用解决方案,而Dictionary <>提供了比List <>更清晰的解决方案。
所有包装器共有的类声明
public Dictionary datadict = new Dictionary();
和
public Dictionary 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"];
列表<>对我来说更清洁。