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

C#中的枚举器(译)

这在C# 2.0中比 C# 1.1更容易实现一些。作为演示,我们先在 C# 1.1中为一个简单的集合添加枚举,然后我们修改这个范例,使用新的C#2.0 枚举构建方法。...IEnumerable 类和与其相关的 IEnumerator类之间的关系有一点微妙。实现IEnumerator接口的最好办法是在IEnumerable类里创建一个嵌套的IEnumerator类。...public class ListBox : IEnumerable { // 嵌套的私有ListBoxEnumerator类实现 private class ListBoxEnumerator...现在,从上个例子中挪去整个嵌套类,并且用下面的代码替换 GetEnumerator方法。...不需要为每个类型实现你自己的enumerator,不需要创建嵌套类。你已经移除了至少30行代码,并且极大地简化了你的代码。程序继续像期望的那样运行,但是状态管理不再是你的任务,所有的都为你做好了。

1.9K40

迭代器模式 与 C# IEnumeratorIEnumerable

迭代器模式 与 C# IEnumerator/IEnumerable Part1 迭代器模式 与 接口 IEnumerable IEnumerator interface IEnumerable{...一个集合类可以提供多个不同的 GetEnumerator 实现,如 GetEnumerator1,GetEnumerator2,返回不同的 IEnumerator,以实现不同的迭代功能。...(见下文) Part3 IEnumerator 与 yield 一个集合类想要支持被迭代,最主要的是构造一个 Enumerator 类,实现 IEnumerator 接口,在 GetEnumerator...在实际的编程中,一般直接使用已有的集合元素,不必从头实现一个 IEnumerator 。 yield 是 C# 提供语法糖,可以方便的实现 IEnumerator 接口。...Part4 实现多个不同的 IEnumerator 有一个 MusicCollection 集合类,里面包含了 IList{Music} 集合,现在要在其中实现对 Music.Title , Music.Author

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

    C# 发展历史及版本新功能介绍

    应尽可能使用这些类来代替某些类,如 System.Collections 命名空间中的 ArrayList。 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。...指定基类的所有部分必须一致,但忽略基类的部分仍继承该基类型。 各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。...下面的示例演示嵌套类型可以是分部的,即使它们所嵌套于的类型本身并不是分部的也如此。...abstract sealed 基类 new 修饰符(嵌套部分) 泛型约束 匿名方法 在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。...继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。

    4.2K20

    牛啊后续:如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)

    这样就可以让所有实体类的summary信息被写入到输出目录下。如果有多个xml文件也没关系,下面的包已经实现自动解析多个xml文件功能,只选取匹配的那个。...昨天的演示文章可参考: C#/.NET一行代码把实体类类型转换为Json数据字符串 https://mp.weixin.qq.com/s/nVcURD0lf5-AQOVzwHqcxw 对实体类添加注释,...该实体类嵌套一层集合属性。.../s/LpsjBhDDzkwyLU_tIpF-lg 1.0.3版本: C#实现图片转Base64字符串,以及base64字符串在Markdown文件内复原的演示 https://mp.weixin.qq.com.../s/n9VtTCIiVUbHJk7OfoCcvA 1.0.2版本: C#实现Ping远程主机功能(支持IP和域名) https://mp.weixin.qq.com/s/d-2HcIM1KaLo-FrrTLkwEw

    14310

    C#的扩展方法解析

    继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。...当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。...(3).C#编译器查找静态类中的扩展方法时,要求这些静态类本身必须具有文件作用域。       (4).C#编译要求“导入”扩展方法。...(静态方法可以任意命名,C#编译器在寻找方法时,需要花费时间进行查找,需要检查文件作用域中的所有的静态类,并扫描它们的所有静态方法来查找一个匹配)       (5).多个静态类可以定义相同的扩展方法。...2.扩展方法声明:      (1).必须在一个非嵌套的、非泛型的静态类中(所以必须是一个静态方法)      (2).至少有一个参数。

    2K70

    通过运行期类型检查实现泛型算法

    零、第一次优化 虽然我们可以通过指定不同的类型参数来实现泛型类的复用,但是在某些情况下通用就意味着我们无法利用具体类型的优势。...针对这一点 C# 允许在发现类型参数所表示的对象具有更多的功能时编写更具体的代码。...首次调用这个方法时会把输入的序列访问一遍,然后让嵌套类可以在这个列表上反向访问元素。...有时尽管参数实现了 IList 但是它的编译期类型仍然是 IEnumerable,因此我们必须提供新的构造函数的同时修改旧的构造函数。...但是当 T 是 string 时性能就会大打折扣,因为我们的代码本身并没有实现 IList ,因此我们需要在泛型类中编写更具体的代码才能解决这个问题,我们需要在 DemoEnumerable 类中加入如下的嵌套类

    62110

    .NET中数据访问方式(一):LINQ

    可查询类型 LINQ之所以能够使用相同的语法操作不同的数据源,是因为和LINQ直接打交道的是可查询类型而非数据源,在LINQ中,直接或间接实现了IEnumerable接口的类型称为可查询类型, ....NET中如:List,Dictionary,数组(由CLR负责隐式实现IEnumerable接口)等,实现了IEnumerable接口。...扩展方法(又称为标准查询) System.Linq.Enumerable类和System.Linq.Queryable类,分别针对IEnumerable和IQueryable接口进行的扩展。...NET也提供了几个对IEnumerable和IQueryable接口进行操作的扩展方法,如: Cast和OfType。...System.Collection.Generic.IEnumerable IEnumerable先将数据放到本地内存中,然后再执行过滤操作(如果有的话),适合于对当前进程中的数据进行查询操作,如

    2.7K30

    LINQ驱动数据的查询功能

    二、LINQ的基础       LINQ本身以IEnumerable两个接口为基础,IEnumerable则负责泛型的集合,目前.NET Framework内的泛型集合类 System.Collection.Generic...命名空间都已实现 IEnumerable,一般来说在.NET内的所有集合对象都能使用LINQ进行处理,如果不引用System.Linq命名空间,所有Linq功能都无法使用。...实现扩展方法十分简单,只需要建立一个静态类,名称建议用 "要扩展的类名称"+Extension字样,例如扩展Int的方法,就将类名命名为Int32Extension,接下来在类内加入要扩展的方法,但是要注意两件事...,其变量类型声明会使用var类型表示,var类型代表编译器腿短这个变量的类型,在LINQ中复杂查询如果是嵌套的错误率较高,所以用var替代。...总结:目前常用的联接模式,Inner join由Enumerable.Join()实现,CROSS JOIN 由EnumerableSelectMany实现,还有一种Join模式没有考虑:LEFT

    2.9K90

    .net 温故知新:【6】Linq是什么

    如下是官方文档对于Linq的描述: 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。...委托是和类平级的应以,理应放类同级别,但是C#支持类嵌套定义,所以我们把和本类关联性强的委托可以嵌套定义,委托变量comparison指向方法后,调用comparison(1, 2)执行委托方法并打印。...我们需要扩展List类的方法,当然不用扩展方法也是可以实现,直接写方法然后调用,但是为了还原框架实现方式,我们模仿IEnumerable类(List 继承至IEnumerable)。...Linq,虽然实际的IEnumerable扩展方法里面还有其它操作,但是通过这个过程我们知道了Linq的实现。...在IEnumerable扩展方法返回参数仍然是IEnumerable,所以可以像开始我们写的那样进行链式调用。

    2.7K30

    C#5.0新增功能01 异步编程

    此代码清楚地表达了按钮的单击事件的目的,它无需手动管理后台线程,而是通过非阻止性的方式来实现。 内部原理 异步操作涉及许多移动部分。...在 C# 方面,编译器将代码转换为状态机,它将跟踪类似以下内容:到达 await 时暂停执行以及后台作业完成时继续执行。 从理论上讲,这是异步的承诺模型的实现。...此示例演示如何为一组 User 捕捉 userId 数据。...请注意,未由代码显式调用的某些方法(如事件处理程序或 Web 控制器方法)并不一定适用。 由于它们未由代码显式调用,因此对其显式命名并不重要。 async void 应仅用于事件处理程序。...此外,此类异步代码嵌套可能会对推断代码的执行带来更多困难。 Async 和 LINQ 的功能都十分强大,但在结合使用两者时应尽可能小心。

    2.4K20

    总结一下 IEnumerable 的例子

    IEnumerable及其泛型版本IEnumerable定义了一个类型的“可迭代性”。这点很容易理解,系统中的很多集合类型都实现了该接口。 因此这些集合类型均可以采用foreach进行迭代遍历。...建议读者在使用框架中实现了IEnumerable的类型时,一定要注意迭代的细节,可以通过MSDN上的文档了解其特殊性。...通过Linq中提供的一些扩展方法,可以方便的控制对于一个IEnumerable对象的迭代方式。通过这些方法的应用,可以在很多时候避免复杂的条件和循环嵌套。...通过这种操作可以在一个函数内采用一些以前不容易实现的方式实现一些操作: 将多重循环拉平 将多级条件判断变为循环判断 无需创建新的类就能快速生成一个上下文需要的特殊迭代算法 这相关的例子在《试试IEnumerable...异步迭代器 在 C# 8 和 .netcore 3.0 到来的版本中,我们迎接到了IAsyncEnumerable接口来实现异步迭代器的功能。

    99700

    重温设计模式 --- 迭代器模式

    在 C# 中,迭代器模式可以通过实现IEnumerable和IEnumerator接口来实现。...其中 IEnumerable接口定义了一个GetEnumerator方法,返回一个实现了IEnumerator接口的迭代器对象。...迭代器实现 public class MyCollection : IEnumerable { private int[] items = new int[5] { 31, 12, 3,...此外,通过实现IEnumerable和IEnumerator接口,我们可以轻松地在 C# 中实现迭代器模式。 foreach是C#语法糖,用来遍历实现了IEnumerable接口的集合类。...foreach 循环的原理是通过调用集合类的GetEnumerator方法,返回一个实现了IEnumerator接口的迭代器对象,然后通过迭代器对象的MoveNext方法,依次访问集合中的每个元素,直到集合中的所有元素都被访问完毕

    14410

    迭代器模式

    根据定义,Microsoft .NET Framework集合是至少实现IEnumerable(或非泛型IEnumerable接口)的类。...此接口至关重要,因为至少必须实现IEnumerable的方法,才支持迭代集合。IEnumerable和IEnumerator接口的类图: ?...,C#编辑器编译成的IL代码会包含IEnumerator的实现。....NET Framework中迭代器模式的应用 C#的foreach语句其实就是迭代器模式。任何可以使用foreach进行遍历的对象,它一定是实现了IEnumerable接口。...迭代器模式的使用感受 迭代器模式是与集合类紧密绑定在一起的,一般来说,我们只要实现一个集合类,就应该同时提供这个集合的迭代器,就像C#中的Collection,List、Set、Map等,这些集合都有自己的迭代器

    65030

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券