在C#中,list<>和dictionary<>有什么区别?

23

我有一个关于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);
   }
}

我不太清楚它们的区别,但在字典中,我们像添加(键,值)对一样添加项目,而在列表中,我们只是添加项目而没有指定任何键...

有人能解释一下吗?


14
你的问题已经很清晰易懂了;) - Seb
6个回答

36

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 之间的主要区别:列表允许您将项目放置在特定位置,就像数组一样,并且它们保持在那里直到您将它们移动。


请查看以下两个链接的示例:http://www.dotnetperls.com/dictionaryhttp://www.dotnetperls.com/list - SShebly

14

List<>Dictionary<,> 是两种非常不同的数据结构,用于不同的目的。List 只是一组项目的集合,而 Dictionary 则是一组键值对。

当你有一组复杂对象并希望通过某些方式(例如,ObjectName/ObjectId)快速访问时,Dictionary 非常有用。在这种情况下,您可以创建一个 IDictionary<string, TObject>,其中键将是 ObjectId,值将是对象本身。

一些区别:

  • List 保留项目的顺序,而 Dictionary 不保留
  • List 允许通过索引快速访问
  • List 支持内置的 QuickSort 算法,以进行快速数据排序
  • Dictionary 允许使用键快速访问项目(值),时间复杂度约为 ~O(1)

13
  • Dictionary<K,V>是一种关联数组,或称为映射。它是一种可以被任何类型的值索引的容器。
  • List<T>是一种整数索引数组。它是一种由连续整数索引的容器。

因此,关键区别在于这些容器的索引方式不同。

不要认为Dictionary<int,T>在语义上等同于List<T>。区别在于List<T>的索引是连续的,而Dictionary<int,T>的索引中可能会出现间隙。


3
列表:在列表中,可以添加重复记录。
字典:在字典中,键必须是唯一的。无法在字典中添加重复键。

0
我有一个类库,它访问各种T-SQL存储过程;每个存储过程返回一行数据,但列数不同。我需要一个通用解决方案来检索这些值,而Dictionary<>提供了比List<>更清晰的解决方案。
所有包装类共用的类声明如下:
public Dictionary<string, String> datadict = new Dictionary<string, string>();

并且

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

调用一个“Reader”后,数据字典会被加载。

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<>更加简洁。


0
列表中的元素具有以下特征:
- 除非明确重新排序(例如通过排序列表),否则它们保持其顺序。 - 它们可以是任何类型,并且类型可以混合使用。 - 它们通过数字索引(以零为基础)进行访问。
字典中的元素具有以下特征:
- 每个条目都有一个键和一个值。 - 不保证顺序。 - 使用键值来访问元素。 - 键值可以是任何哈希表类型(即不是字典)和类型可以混合使用。 - 值可以是任何类型(包括其他字典),并且类型可以混合使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接