Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LISP中的关联列表与C#中的字典是一样的吗?_C#_Lisp_Common Lisp - Fatal编程技术网

LISP中的关联列表与C#中的字典是一样的吗?

LISP中的关联列表与C#中的字典是一样的吗?,c#,lisp,common-lisp,C#,Lisp,Common Lisp,我正在读一本关于CommonLisp的书,作者说:“列表由存储在列表中的键/值对组成。” 这让我想,这和C#中的措辞是不是一样? 如果是,为什么?是的,基本上是一样的。也称为关联数组(perl)和映射(java和其他)。它是从键到值的映射。因此,它可以起到类似于字典的作用。在Lisp的发展过程中,添加了具有类似用途的哈希表。是的,它们非常相似,具有类似的用途,但至少有一个显著的区别: 一个.NET字典不能有多个具有相同密钥的项 显然,: 在关联列表中搜索具有给定键的关联时,如果存在多个键,则返回

我正在读一本关于CommonLisp的书,作者说:“列表由存储在列表中的键/值对组成。”

这让我想,这和C#中的措辞是不是一样?
如果是,为什么?

是的,基本上是一样的。也称为关联数组(perl)和映射(java和其他)。它是从键到值的映射。因此,它可以起到类似于字典的作用。在Lisp的发展过程中,添加了具有类似用途的哈希表。

是的,它们非常相似,具有类似的用途,但至少有一个显著的区别:

一个.NET
字典
不能有多个具有相同密钥的项

显然,:

在关联列表中搜索具有给定键的关联时,如果存在多个键,则返回找到的第一个键


alists和哈希表(字典使用)之间的比较,因为似乎还没有人涉及到这一点:

主义者:

  • 易于实现(只是一个配对列表)
  • 具有线性时间查找(因此仅对小列表有用)
哈希表:

  • 需要多做一点努力来实现(特别是,您必须为键实现一个稳定的哈希函数)
  • 已摊销固定时间查找

抽象概念和具体数据结构之间有区别

字典是一个抽象概念——键到值的映射。它可以通过几种不同的方法实现:

  • 作为一个列表:键-值对(Lisp的alists),一个交错键和值的平面列表(Lisp的plists),作为一对键和值的列表
  • 作为一个表,可以是Lisp的哈希表/Java的哈希表或其他类型的表
  • 作为树(Java的树映射)
C#的字典是一种数据结构,它支持(摊销)常量查找时间,就像CL的哈希表一样。在这方面,它不同于具有线性查找时间的alist。此外,alist不依赖元素的哈希代码来存储/检索它。alists的API与Dictionary的API也不同。有
assoc
rassoc
分别从左侧和右侧查找元素。(因此,与传统词典不同,同一个键可以有多个映射到同一个表中的不同值)。还有
acon
pairlis
来构建
alist

编辑最后,没有从列表中删除项目的标准功能。
您可以使用
(删除key-alist:key#car)
删除元素。但是请注意,此操作会保留原始列表,并返回一个修改后的列表。

尽管Perl程序员倾向于在一般情况下称其为“哈希”,尽管我们知道在好的一天,它们应该被称为“关联数组”。只是为了好玩,JavaScript调用了相同的概念“Objects”。.NET的
字典
是使用哈希表实现的。因此,触及列表和哈希表之间的区别可能更有用。我可以。但不需要。通常列表是破坏性的,很容易替换现有值。从列表中删除是
(remove key alist:key#car)