c#中list <>和dictionary <>有什么区别?

问题描述 投票:16回答:4

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

我不确切地知道有什么区别,但是在字典中我们添加像(键,值)对的项目,在列表中我们只是添加项而不指定任何键。

有人会澄清这个吗?

c# .net winforms list dictionary
4个回答
31
投票

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之间的主要区别:一个列表可以让你把物品放在特定的位置,就像一个阵列一样,它们一直呆在那里直到你移动它们。


10
投票

List<>Dictionary<,> - 用于不同目的的完全不同的数据结构,List只是一组项目,Dictionary是一组键值对。

当你有一组复杂的对象并想要快速访问时,字典非常有用,比如说ObjectName / ObjectId,在这种情况下你创建IDictionary<string, TObject>,其中key是ObjectId,Value是一个对象本身。

一些差异:

  • 列出项目的持久顺序,字典没有
  • 列表允许按索引快速访问
  • 列出QuickSort算法内置的支持,用于快速数据排序
  • 字典允许~O(1)时间复杂度通过键访问项目(值)

6
投票
  • Dictionary<K,V>是一个关联数组或映射。它是一个可以通过任何类型的值索引的容器。
  • List<T>是一个整数索引数组。它是一个由连续整数索引的容器。

因此,本质区别在于容器的索引方式。

不要陷入相信Dictionary<int,T>在语义上等同于List<T>的陷阱。区别在于List<T>的索引是连续的,而Dictionary<int,T>的索引可能存在差距。


0
投票

我有一个类库,可以访问各种T-sql sprocs;每个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"];

列表<>对我来说更清洁。

© www.soinside.com 2019 - 2024. All rights reserved.