我对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);
}
}
我不确切地知道有什么区别,但是在字典中我们添加像(键,值)对的项目,在列表中我们只是添加项目而不指定任何键..
有人会澄清这个吗?
答案 0 :(得分:31)
IDictionary
用于键 - >值图,ICollection
用于类似对象的集合。
ICollection
是类似对象集合的接口:表单上的控件,列表中的元素,XML标记中的属性等等。从.NET 2.0开始,有一个通用版本,因此您可以将整数集合称为ICollection<int>
。
IDictionary是用于将一种类型的对象或值映射到另一种类型的接口。它就像一本真正的字典或电话簿:你有一个“钥匙”,就像一个人的名字,当你查找它时,你得到一些由该键识别的信息,如地址或电话号码。每个键只能列出一次,但仍允许两个不同的键具有相同的值。这在.NET 2.0中也是通用的,因此字符串为字符串且值为整数的字典为IDictionary<string,int>
。
字典实际上是键/值对的集合:您可以使用IDictionary<int,string>
作为ICollection<KeyValuePair<int,string>>
,并且可以使用“键和值”属性将键和值作为单独的集合进行访问。
ICollection
和IDictionary
都是无序的,这意味着虽然您可以使用CopyTo
方法或foreach循环以某种顺序检索元素,但该顺序没有特殊含义,它可能没有明显的原因改变。这是ICollection
和IList
之间的主要区别:列表允许您将项目放在特定位置,就像数组一样,并且它们会一直存在,直到您移动它们为止。
答案 1 :(得分:10)
List<>
和Dictionary<,>
- 用于不同目的的完全不同的数据结构,List只是一组项目,Dictionary是一组键值对。
当你拥有一组复杂的对象并希望快速访问时,如果说ObjectName / ObjectId,则字典非常有用,在这种情况下,你创建IDictionary<string, TObject>
,其中key是ObjectId,Value将是一个对象本身
一些差异:
O(1)
时间复杂度通过键答案 2 :(得分:6)
Dictionary<K,V>
是关联数组或地图。它是一个可以通过任何类型的值索引的容器。List<T>
是一个整数索引数组。它是一个由连续整数索引的容器。因此,本质上的区别在于容器的索引方式。
不要陷入相信Dictionary<int,T>
在语义上等同于List<T>
的陷阱。区别在于List<T>
的索引是连续的,而Dictionary<int,T>
的索引中可能存在 gap 。
答案 3 :(得分:0)
我有一个类库,可以访问各种T-sql sprocs;每个sproc返回一行但不同的列。我需要一个通用的解决方案来检索值和Dictionary&lt;&gt;提供了比List&lt;&gt;。
更清晰的解决方案所有包装器共有的类声明
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一样检索数据; E.g:
datadict = myData.LoadData("spGetSSN", "", "");
ssn1 = datadict["SSN1"];
ssn2 = datadict["SSN2"];
ssn3 = datadict["SSN3"];
List&lt;&gt;。
对我来说更清洁答案 4 :(得分:0)
列表中的元素具有以下特征:
除非明确重新排序(例如,通过对列表进行排序),否则它们将保持其排序。 它们可以是任何类型,并且可以混合使用。 通过数字(从零开始)索引访问它们。 字典中的元素具有以下特征:
每个条目都有一个键和一个值 不能保证订购 使用键值访问元素 键值可以是任何哈希表类型(即非dict),并且类型可以混合 值可以是任何类型(包括其他字典),并且类型可以混合
答案 5 :(得分:0)
列表:在列表中,可以添加重复记录。
字典:字典中的键必须是唯一的。无法在字典中添加重复键。