首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#语言各种集合介绍

接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象...通过这个对象,可以遍历访问集合类对象中的每一个元素对象 如果集合类是用户自定义的集合类,则用户必须实现它的GetEnumerator()方法,否则不能使用循环。...当然,与这个自定义集合类对应的IEnumerator类(实现了该接口的类),也要自定义一个才行 比如,ArrayList集合类对应的IEnumerator是 ArrayListEnumeratorSimple...)Queue 实现了接口:ICollection、IEnumerable Queque是队列,先进先出的访问各个元素 可以调用Queque对象的GetEnumerator()方法,得到IEnumerator...O(log n) 随集合中元素的增加而增加,每个元素需要增加的时间不是线性的,而是呈对数曲线。

62321

C#集合类型大揭秘

我们可以自己实现IEnumerable接口和IEnumerator接口实现自定义集合。...实际上List维护了一定长度的数组(默认为4),当插入元素的个数超过4或初始长度时,会去重新创建一个新的数组,这个新数组的长度是初始长度的2倍,然后将原来的数组赋值到新的数组中。...我们可以将HashSet看作是简化的Dictionary,只不过Dictionary存储的键值对对象,而HashSet存储的是普通对象。...6.Queue 队列是一种先进先出的结构,C#的队列也是借助数组实现的,有了前面的经验,借助数组实现必然会有数组扩容。C#的队列实现其实是循环队列的方式,可以简单的理解为将队列的头尾相接。...线程安全的集合类 需要我们注意的是,上面我们所介绍的集合并不是线程安全的,在多线程环境下,可能会出现线程安全问题。在多线程读的情况下,我们使用普通集合即可。

1.5K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#集合类型大揭秘

    集合类不直接支持 IEnumerator 和 IEnumerator 接口。...我们可以自己实现IEnumerable接口和IEnumerator接口实现自定义集合。...实际上List维护了一定长度的数组(默认为4),当插入元素的个数超过4或初始长度时,会去重新创建一个新的数组,这个新数组的长度是初始长度的2倍,然后将原来的数组赋值到新的数组中。...C#的队列实现其实是循环队列的方式,可以简单的理解为将队列的头尾相接。至于为什么要这么做?为了节省存储空间和减少元素的移动。...入队操作: 出队操作: 线程安全的集合类 需要我们注意的是,上面我们所介绍的集合并不是线程安全的,在多线程环境下,可能会出现线程安全问题。在多线程读的情况下,我们使用普通集合即可。

    1.2K70

    .NET面试题系列 - IEnumerable的派生类

    Pop 操作会返回栈顶的数据项,但是此操作也会把此数据项从堆栈中移除。如果只是希望察看栈顶的数据项而不是真的要移除它,在 C#语言中有一种名为 Peek(取数)的操作可以实现。...队列的另外一个主要操作就是查看起始数据项。就像在 Stack 类中的对应操作一样,Peek 方法用来查看起始的数据项。这种方法仅仅返回数据项,而不会真的把数据项从队列中移除。...迭代是指从集合的头部,一个一个将元素拿出来,直到全部拿完为止的操作。迭代不能倒车,只能前进。IEnumerable是迭代器模式的实现。 通常将迭代中拿出来的元素称为iterator。...IEnumerator类型的Reset方法将这个值设为-1。通常不实现Reset方法,这是为了防止多次迭代。 IEnumerator接口的MoveNext方法将位置增加一,并返回是否还有下一个元素。...它又有两个主要的派生类Array和List。List的内部实现是一个数组而不是链表。LinkedList才是C#的链表实现。LinkedList不实现IList接口。

    1.7K20

    C#集合类型大盘点

    俗话说知其然,知其所以然,平常看到IEnumerable,IEnumerator,ICollection是不是知道他们之间各自的区别?除了List和Dictionary以外,你还用过哪些其它的集合类?...get; } void Reset(); }   IEnumerator定义了我们遍历集合的基本方法,以便我们可以实现单向向前的访问集合中的每一个元素。...IEnumerable是一个很有用的接口,实现它的好处包括: 支持foreach语句 作为一个标准的集合类与其它类库进行交互 满足更复杂的集合接口的需求 支持集合初始化器   当然实现的方法也有很多,如下...而实际上也是如此,我们可以说ICollection比IEnumerable多支持一些功能,不仅仅只提供基本的遍历功能,还包括: 统计集合和元素个数 获取元素的下标 判断是否存在 添加元素到未尾 移除元素等等...但是不同的地方在于,SortedList实际是将数据存存储在数组中的。也就是说添加和移除操作都是线性的,时间复杂度是O(n),因为操作其中的元素可能导致所有的数据移动。

    1.1K70

    C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

    以上代码说明自定义集合类型(假设CatList是集合类型)是无法使用foreach进行循环的....原因是C#中自定义集合类型要实现foreach的功能,必须通过IEnumerator和IEnumerable两个接口来实现!...2、通过IEnumerator和IEnumerable两个接口实现自定义集合类型的foreach循环功能....第一步:实现自定义集合类型实现IEnumerable接口,实现该接口的字面意思可以理解为:自定义集合类型实现了该接口,就拥有了"可枚举的功能".代码如下: ?...Important 3、将初始化完的类数组作为参数传递给迭代器类 4、编写迭代器类,create 构造函数,接收自定义集合类初始化完的类数组 5、实现IEnumerator(迭代器)接口,实现对应的三个方法

    951100

    迭代器模式

    它可以让用户透过特定的接口访问集合中的每一个元素而不用了解底层的实现。一般实现一个集合的方法有:数组,链表,哈希表等等,每种集合因为底层实现不同,遍历集合的方法也不同。...此接口至关重要,因为至少必须实现IEnumerable的方法,才支持迭代集合。IEnumerable和IEnumerator接口的类图: ?...yield定义迭代器,可在实现自定义集合类型迭代器模式时无需其他显式类,使用yield return语句可一次返回一个元素。....NET Framework中迭代器模式的应用 C#的foreach语句其实就是迭代器模式。任何可以使用foreach进行遍历的对象,它一定是实现了IEnumerable接口。...迭代器模式的使用感受 迭代器模式是与集合类紧密绑定在一起的,一般来说,我们只要实现一个集合类,就应该同时提供这个集合的迭代器,就像C#中的Collection,List、Set、Map等,这些集合都有自己的迭代器

    65030

    .NET面试题系列 - IEnumerable

    实现了这个接口的类可以使用Foreach关键字进行迭代(迭代的意思是对于一个集合,可以逐一取出元素并遍历之)。实现这个接口必须实现方法GetEnumerator。...这个类型实际上的作用就相当于Person[]或List,但我们不能使用它们,因为它们已经实现了IEnumerable,故我们构造一个People类,模拟很多人(People是Person...//People类就是Person类的集合 //但我们不能用List或者Person[],因为他们都实现了IEnumerable //我们要自己实现一个IEnumerable...,编译器将会自动实现继承IEnumerator接口的类和上面的三个方法。...我们可以使用ILSpy察看编译后的程序集的内容,并在View -> Option的Decompiler中,关闭所有的功能对勾(否则你将仍然只看到一些yield),然后检查Program类型,我们会发现编译器帮我们实现的

    65420

    认真CS☀️yield迭代

    首先我们来说下迭代的目的: 迭代是将自定义类变为自定义类数组,并遍历它 在C#1.0和C#2.0这两个版本中,C#2比C#1多了一个更简洁的迭代方法 C#1.0 1️⃣ 实现迭代的操作流程: 1、定义单个类...,迭代器块可以是方法主体、访问器主体或运算符主体,他能够使您在类或结构中支持foreach迭代,而不必实现整个IEnumerable接口(不实现它其中的枚举器接口),只需提供一个迭代器,即可遍历类中的数据结构...类中,将GetEnumerator方法中代码改为如下代码,用迭代器创建枚举器 public IEnumerator GetEnumerator() { for(int i...IEnumerable接口的实现类(内有GetEnumerator方法)、枚举器类,才能在Main方法实例该类数组遍历它, C#2我们仅写单个类、IEnumerable接口的实现类,不必写枚举器类,便可在...再次重申一下,迭代器块可作为方法主体、访问器块主体和运算符主体 5️⃣ 其他注意事项 在编译器生成的IEnumerator枚举器方法中,Reset方法(用来重置)并没有实现,因此调用它会抛出System.NotSpportedception

    7810

    C#2.0新增功能05 迭代器

    在以下示例中,DaysOfTheWeek 类实现 IEnumerable 接口,此操作需要 GetEnumerator 方法。...在以下示例中,Stack 泛型类实现 IEnumerable 泛型接口。...在 C# 中,迭代器方法不能有任何 in、ref 或 out 参数。 在 C# 中,“yield”不是保留字,只有在 return 或 break 关键字之前使用时才有特殊含义。...技术实现 即使将迭代器编写成方法,编译器也会将其转换为实际上是状态机的嵌套类。 只要客户端代码中的 foreach 循环继续,此类就会跟踪迭代器的位置。...若要查看编译器执行的操作,可使用 Ildasm.exe 工具查看为迭代器方法生成的 Microsoft 中间语言代码。 为类或结构创建迭代器时,不必实现整个 IEnumerator 接口。

    72550

    从yield关键字看IEnumerable和Collection的区别

    在Main方法中,将GetVetors方法的返回值赋值给一个变量,然后对每一个Vector对象的X和Y进行重新赋值,最后将每一个Vector的信息输出来。...{ [DebuggerHidden] get; } 21: } 这是一个实现了众多接口的类型,实现的接口包括:IEnumerable, IEnumerable, IEnumerator...d__0 类大部分成员都没有复杂的逻辑,唯一值得一提的就是MoveNext方法。从中我们清楚地但到,对Vector对象的创建发生在每一个迭代中。...由于它们也实现了接口IEnumerable,所以不会存在什么问题。...IEnumerable这个接口和集合没有本质的联系,只是提供“枚举”的功能。甚至说,我们应该将IEnumerable对象当成“只读”的,如果我们需要“可写”的功能,你应该使用数组或者集合类型。

    79180

    .NET面试基础知识

    IEnumerator 这些都是向前使用的,并且只读取一个集合的访问权限。 ? IEnumerable使用IEnumerator,它可以与foreach语句一起使用。...IEnumerator有MoveNext、重置方法和当前属性。它可以与while语句一起使用。...IEnumerable 以从内存集合中查询数据(比如,列表) 它在内存中加载数据(服务器端到客户端),同时从数据库查询数据,然后过滤客户端数据。 不支持自定义查询。 不支持延迟加载。...IComparer 它们都可以用于集合中的自定义排序。主要的区别是 IComparable允许内部排序实现,而IComparer允许外部定制排序实现。 ? IComparable ? ?...Use of stream 当数据量太大时,很难同时将整个数据加载到内存中。流用于从大文件中读取数据。您可以读取小块的数据,其中大文件被分解成小块。

    84520

    C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

    它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。...所以我们根据上面的讲解我们就让People类实现IEnumerable接口吧。现在先来修改People实体类。...自定义两个接口并进行实现   上面我们是通过继承微软类库中的接口来实现的实体集合的foreach遍历。下面我们来演示一下完全通过自己创建接口来实现自己定义的实例集合的foreach遍历。...IMyEnumerable代替MyList IMyEnumerable list = new MyList(); ///得到迭代器,在循环中针对迭代器进行编码,而不是集合...其实我定义的两个接口使用的是IMyEnumerable和IMyEnumerator,这里你直接可以去掉My那么就是微软类库里面的接口了,我这里只是自定义罢了,然后我自己定义接口的方法属性,没有严格按照微软的接口进行定义

    59620

    【愚公系列】2023年11月 二十三种设计模式(十六)-迭代器模式(Iterator Pattern)

    特别是在解释器模式中,当需要解释的语法规则涉及到集合的操作时,可以使用迭代器模式来帮助解释器遍历集合中的元素。...解释器模式主要关注语法解释和表达式求值,而不是集合遍历。具体迭代器通常是与迭代器模式相关的设计模式中的概念。...可能还包括其他方法,如remove(),用于从集合中删除元素(不是必须的,取决于具体实现)。...解释器模式主要关注语法解释和表达式求值,而聚合通常是与其他设计模式,如迭代器模式(Iterator Pattern)相关的概念。具体聚合是迭代器模式中的一个概念,而不是解释器模式中的概念。...实现IEnumerator接口。

    16722

    .NET中的泛型集合

    IEnumerator定义了我们遍历集合的基本方法,以便我们可以实现单向向前的访问集合中的每一个元素。所有的集合类都继承了IEnumerator接口,包括String类。...如果从数据库角度来考虑,表就是IEnumerable,而游标是IEnumerator。...我通常倾向于将接口作为方法和属性的返回类型,而不是保证一个特定的实现类。在API中公开易变集合之前,你也应该深思熟虑,特别是当集合代表的是对象或类型的状态时。...所有这些操作返回的都是链表中的节点而不是节点的值;如果链表是空(empty)的,这些属性将返回空(null)。...本质上,它们在获取项的顺序上有所不同;队列和栈与它们非并发等价类的行为一致,而ConcurrentBag没有顺序保证。 它们都以线程安全的方式实现了IEnumerable。

    19420

    C# 常用接口学习 IEnumerable

    我们先去看看公开的.Net4.0的源程序中IEnumerable、IEnumerable、IEnumerator和IEnumerator这四个接口是如何声明的: 需加微信交流群的,请加小编微信号...get; } void Reset(); } 一、接口IEnumerable实现 1、建一个学生数据结构和一个学生集合类: //student数据结构...2、继承接口IEnumerable: 当我们在类后面加上:IEnumerable后,Visual Studio IDE会冒出来一个小黄灯泡,点进去有提示自动填充接口的约定,我们选第一项实现接口(Visaul...设置成-1而不是0是因为迭代器首先调用MoveNext,在MoveNext里面我们先把索引+1指向下一个元素,如果索引_index的值初始为0,则第一个元素是元素集[1],第二个元素了。...我们实现了可枚举的自己的类。

    80230
    领券