我最近了解了一种称为链表上的队列(堆栈)的集合类型,以及如何使此类集合在 foreach 循环中可枚举。
自然,问题立即出现了——如何实现这样一个集合中元素的索引?无论我如何绞尽脑汁,如果不使用现有的收藏,就无法发明任何东西。
但不知何故,这是在 C# 的主集合本身中实现的(据我所知,主集合是一个数组)。 Chat GPT 和 Gemini 也没有就此事回答任何可以理解的内容。
请赐教,谁知道C#中数组索引是如何实现的?先感谢您!
我最近了解了一种称为链表上的队列(堆栈)的集合类型,以及如何使此类集合在 foreach 循环中可枚举。
自然,问题立即出现了——如何实现这样一个集合中元素的索引?无论我如何绞尽脑汁,如果不使用现有的收藏,就无法发明任何东西。
但不知何故,这是在 C# 的主集合本身中实现的(据我所知,主集合是一个数组)。 Chat GPT 和 Gemini 也没有就此事回答任何可以理解的内容。
请赐教,谁知道C#中数组索引是如何实现的?先感谢您!
索引数组与索引任何其他集合不同,因为数组是唯一的本机集合。
通过索引访问数组元素是从距数组开头一定偏移量的内存单元获取数据,该偏移量等于一个数组元素的大小乘以索引。这就是为什么数组中的索引是从0开始的,因为根据公式,第一个元素的地址与数组的开头重合。
至于其他集合,不要将可枚举性与索引混淆。集合可能不包含索引,但可枚举(实现接口
IEnumerable<T>),反之亦然,对象可能包含索引器(T1 this[T2],但不可枚举。这是一个可枚举集合的示例,它根本不是一个集合,而是一个简单的枚举器。
这是如何使用它
控制台输出
这是带有索引器的对象的示例
它只是返回双倍索引
控制台输出
正如您所理解的,为了使某些内容可枚举或可索引(或同时两者),根本没有必要将任何数据存储在真实的集合中。正如我上面所说,.NET 中唯一的本机集合是数组。
相同的列表
List<T>在数组的基础上工作 -这是它的源代码。UPD:您可以在此处或文档中阅读有关索引器的信息。
您可能意识到链表存储的不是对象本身,而是对象的包装器。那么,作为一个选项,可以在包装对象中存储其他属性(索引、上一个……)。唯一的问题是,将其插入链表后,您必须重新索引它。
在抽象数据类型“stack”的定义中,只需要两个操作:push和pop。英文wiki中是这样规定的:Stack(抽象数据类型)。这在俄语版本中没有明确描述。
使用堆栈通常不可能通过索引获取元素。
如果在数组上进行堆栈的特定实现,则可以添加索引。但是,如果像您一样在链表上实现,那么索引就没有意义。
我要补充一点,抽象数据类型“队列”也没有强制索引要求,而只有操作,最常称为入队和出队。