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

最优雅的方式来处理第一个IEnumerable项目不同

处理IEnumerable项目中不同的最优雅方式是在迭代器模式中使用生成器(generator)函数。

在迭代器模式中,生成器函数是用于生成集合中元素的函数。生成器函数可以通过迭代器接口来返回一个生成器对象,该对象可以生成集合中的元素。生成器对象是一个惰性求值对象,只有在需要时才生成下一个元素。

使用生成器函数的优点是,它们可以生成集合中的所有元素,而不需要一次性加载所有元素。这对于处理大型集合非常有用,因为加载所有元素可能需要大量内存。此外,生成器函数还可以根据需要生成元素,因此它们可以用于处理集合中的不同元素。

在处理IEnumerable项目时,使用生成器函数可以避免一次性加载所有元素,并且可以按需生成元素,从而提高处理效率和内存使用效率。

以下是一个使用生成器函数来处理IEnumerable项目的示例代码:

代码语言:csharp
复制
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "John", "Jane", "Jack", "Jill" };

        IEnumerator<string> enumerator = names.GetEnumerator();
        while (enumerator.MoveNext())
        {
            Console.WriteLine(enumerator.Current);
        }
    }
}

在上面的代码中,我们使用List<string>来存储集合中的元素,然后使用GetEnumerator()方法来获取迭代器。在while循环中,我们使用MoveNext()方法来逐个生成集合中的元素,并使用Current属性来获取当前元素。

生成器函数可以使用yield关键字来返回一个生成器对象。在生成器函数中,可以通过迭代器接口来获取下一个元素,并在需要时生成该元素。生成器函数可以通过调用迭代器接口的Next()方法来逐个生成集合中的元素。

以下是一个使用生成器函数来处理IEnumerable项目的示例代码:

代码语言:csharp
复制
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "John", "Jane", "Jack", "Jill" };

        IEnumerator<string> enumerator = names.GetEnumerator();
        while (enumerator.MoveNext())
        {
            Console.WriteLine(enumerator.Current);
        }

        IDictionary<string, object> dict = new Dictionary<string, object>();
        foreach (string name in names)
        {
            dict[name] = name;
        }

        IEnumerator<KeyValuePair<string, object>> enumerator2 = dict.GetEnumerator();
        while (enumerator2.MoveNext())
        {
            Console.WriteLine(enumerator2.Current.Key + " " + enumerator2.Current.Value);
        }
    }
}

在上面的代码中,我们使用IDictionary<string, object>来存储集合中的元素,并使用GetEnumerator()方法来获取迭代器。在while循环中,我们使用MoveNext()方法来逐个生成集合中的元素,并使用Current属性来获取当前元素。

生成器函数可以使用yield关键字来返回一个生成器对象。在生成器函数中,可以通过迭代器接口来获取下一个元素,并在需要时生成该元素。生成器函数可以通过调用迭代器接口的Next()方法来逐个生成集合中的元素。

以下是一个使用生成器函数来处理IEnumerable项目的示例代码:

代码语言:csharp
复制

using System;

using System.Collections.Generic;

using System.Linq;

class Program

{

代码语言:txt
复制
static void Main()
代码语言:txt
复制
{
代码语言:txt
复制
    List<string> names = new List<string> { "John", "Jane", "Jack", "Jill" };
代码语言:txt
复制
    IEnumerator<string> enumerator = names.GetEnumerator();
代码语言:txt
复制
    while (enumerator.MoveNext())
代码语言:txt
复制
    {
代码语言:txt
复制
        Console.WriteLine(enumerator.Current);
代码语言:txt
复制
    }
代码语言:txt
复制
    IDictionary<string, object> dict = new Dictionary<string, object>();
代码语言:txt
复制
    foreach (string name in names)
代码语言:txt
复制
    {
代码语言:txt
复制
        dict[name] = name;
代码语言:txt
复制
    }
代码语言:txt
复制
    IEnumerator<KeyValuePair<string, object>> enumerator2 = dict.GetEnumerator();
代码语言:txt
复制
    while (enumerator2.MoveNext())
代码语言:txt
复制
    {
代码语言:txt
复制
        Console.WriteLine(enumerator2.Current.Key + " " + enumerator2.Current.Value);
代码语言:txt
复制
    }
代码语言:txt
复制
    ICollection<string> col = new List<string>(names);
代码语言:txt
复制
    IEnumerator<string> enumerator3 = col.GetEnumerator();
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Entity Framework Repository模式

第一个:先来看看查询,对于实体类简单的查询操作,每次都是这样的过程会在代码中拥有大量的重复 极为类似的代码段。...在数据访问层,我们可以专门的为每个类进行封装业务处理类,但是其中类与类之间相同或类似的代码段太多,对于编码人员来说,更是浪费时间,同样的代码,要在项目的不同使用地方,进行多次的复制修改几个代码字段即可使用...,那么我们为什么不进行简单的封装处理,来让这一过程变得更加简单,且使我们的代码变得更为优雅,让开发人员的维护操作更为简单,也更易于扩展。...,也会根据具体项目中业务,来进行定义适应自身的方法。...可以看到就这样即可进行调用处理。 总结 ?  简单的项目分层,这里只是简单的处理分层,并没有真正意义上的。仅供参考。 简单测试项目下载链接地址 Entity Framework 5.0基础系列目录

1.1K10

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

只有这样才能真正的让这种技术深入人心,才能在实际的系统开发当中去灵活的运用。 下面我们来构建一个简单的IEnumerable扩展方法,用来处理当前集合中的数据是否可以进行数据的插入操作。...这样我们是不是很优雅的执行了以前BLL层处理的逻辑判断了,而且这部分的扩展方法是可以动态的更改的,完全可以建立在一个独立的程序集当中。...我们继续看例子,该例子是针对继承IEnumerable来分析使用方式; public class OrderCollection : IEnumerable {...根据3.2图中的意思,我们都已经知道扩展方法之间传输的对象都是来自不同的实例但是来自一个对象类型,那么为什么要分段执行每个关键字的操作呢?我们还是用图来帮助我们分析问题吧。 ?...方法中有两个判断,第一个是判断是否是通过扩展方法方式调用代码的,防止我们直接使用扩展方法,第二个判断是确定我们是否提供了表达式。 那么重点是最后一行代码,它包裹着几层方法调用,到底是啥意思呢?

1.5K11
  • .NET深入解析LINQ框架(二:LINQ优雅的前奏)

    在LINQ里面充斥着大量的扩展方法,在这些扩展方法的后背其实是隐藏着一个很大的设计秘密,那就是链式编程模型,下面我们将通过详细的学习链式编程模式来理解LINQ为什么能连贯的使用相同的方法而显现的如此优雅...在很多时候我们设计一个系统功能或者应用框架时,完全可以借助链式设计模式来优雅我们的开发方式,使编码起来很顺利很方便。...这样的处理方式我想是LINQ最为常见的,毕竟LINQ是为了查询而生,而查询主要就是面向集合类的数据。 对象图: ?...这样就可以将一个原本很臃肿的功能设计成如此优雅的使用方式。对于Linq to CustomEntity 实现我后面会有专门的文章讲解,这里也就不往下扯了。...逻辑条件这个时候是被当成查询表达式处理的,而不像IEnumerable接口直接是委托。

    2.1K30

    .NET深入解析LINQ框架(一:LINQ优雅的前奏)

    它的优雅不是一天两天就修来的,归根到底还得感谢C#的设计师们,是他们让C#能如此完美的演变,最终造就LINQ的优雅。 下面我们来通过观察C#的每一次演化,到底在哪里造就了LINQ的优雅前奏。...很多时候我们对集合的处理不是实时的,也就是说我获取集合的数据不是一次性的,需要在我需要具体的某一个项的时候才让我去处理关于获取的代码。...那么表达式目录树到底是啥东西,它的存在是为了解决什么样的问题又或者是为了什么需求而存在的? 我们上面已经讲解过关于Lambda表示式的概念,它是匿名函数的优雅编写方式。...而如果我们使用字符串的方式来表达逻辑的结构,那么我们只能在运行时才能知道它的正确性,这样的正确性是很脆弱的,不知道在什么样的情况下会出现问题。...我们看来例子; 1 Func Func = () => 10; 2 Expression> Expression = () => 10; 编辑器对上述两行代码各采用了不同的处理方式

    1.9K31

    C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

    如果你了解不同查询运算符的执行方式,则有助于理解从给定查询中获得的结果。 如果数据源是不断变化的,或者如果你要在另一个查询的基础上构建查询,这种帮助尤其明显。...本篇根据标准查询运算符的执行方式对其进行分类。 执行方式 即时 立即执行指的是在代码中声明查询的位置读取数据源并执行运算。 返回单个不可枚举的结果的所有标准查询运算符都立即执行。...这意味着,查询的执行结果取决于执行查询而非定义查询时的数据源内容。 如果多次枚举查询变量,则每次结果可能都不同。...几乎所有返回类型为 IEnumerable 或 IOrderedEnumerable 的标准查询运算符皆以延迟方式执行。...如果某个运算符被标入两个列中,则表示在运算中涉及两个输入序列,每个序列的计算方式不同。 在此类情况下,参数列表中的第一个序列始终以延迟流式处理方式来执行计算。

    53120

    .NET框架设计(常被忽视的C#设计技巧)

    sendService.Send(result); 55 } 56 } 57 } 58 } 这里简单实现IBusinessService接口,其实代码很简单,第一个方法使用反射的方式调用代码...然后验证,还是先验证然后Cache或者说内部没有进行任何的逻辑处理;如果我们将特性的视为代码的标识而不是真正的逻辑,那么对于优先级的处理会比较棘手,你需要设计如何将不同的特性处理逻辑关联起来;比较合理的设计方法是特性的处理链表...;本人之前设计过AOP的简单框架,就遇到过对于特性的优先级的处理经验,也是用的链表的方式将所有的特性按照顺序串联起来然后将对象穿过特性内部逻辑,这也符合DDD的中心思想; 下面我们来看代码: 1 Codeusing...,尤其我们现在设计对象的时候会将对象在全局情况下的所有行为都定义在对象内部,比如我们正常人,在不同的角色中才具有不同的行为,我们只有在公司才具有“打开服务器”的行为,只有在家里才可以“亲吻”自己的老婆的行为...namespace中的行为,他们对应不同的场景;第一个TaxRate用来计算税率的行为,只有在Order对象已经处于提交状态时用的;那么第二个行为Inventory用来计算库存的,用户在Shoppingcart

    2K71

    还在拼冗长的WhereIf吗?100行代码解放这个操作

    普通做法 最原始的做法我们是先通过If()判断是否需要进行数据过滤,然后再对数据源使用Where来过滤数据。 示例如下: if(!...string.IsNullOrWhiteSpace(str), a => a == str); 条件一但增多很多的话,这样一来代码看起来就又不够优雅了~ 这时候就想,如果只用一个Where传进去一个对象...首先我们需要考虑如何对对象的属性进行标记来获取我们作为条件过滤的对应属性。那就得加一个Attribute,这里实现一个CompareAttribute,用于对对象的属性进行标记。...Attribute搞定了,接下来则实现我们的WhereObj 这里由于需要动态的拼接表达式,这里使用了DynamicExpresso.Core库来进行动态表达式生成。...,如果不存在则不处理。

    10210

    金三银四面试:C#.NET面试题中高级篇5-Linq和EF

    10.除了EF,列举出你知道的ORM框架? 11.在哪些类型额项目中你会选择EF? 为什么? 12.请说明EF中映射实体对象的几种状态? 1.EF(Entity Framework)是什么?...这样设计的好处在于我们可以针对概念模型进行所有数据操作而不必关心数据的存储关系,使我们可以更加自然的采用面向对象的方式进行面向数据的应用程序开发。 2.什么是ORM?...大部分LINQ语句是在最终结果的第一个元素被访问的时候(即在foreach中调用MoveNext方法)才真正开始运算的,这个特点称为延迟执行。...你也可以通过点击橙色圈内的各种不同格式,看到查询表达式的各种不同表达方式: Lambda:查询表达式的Lambda表达式版本, SQL:由编译器转化成的SQL,通常这是我们最关心的部分, IL:IL语言...所以在一般企业级开发,管理型系统,对数据性能要求不是特别高的情况下,优先选择EF,这样可以大大的推进开发效率!如果像一些互联网项目中,对性能要求精度很高!可以另外做技术选型,选择原生ADO.NET。

    4.2K30

    【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现

    EF Core 批量加载模型 通常情况下,在使用ORM的时候,我们不希望过度的使用特性来标注实体类。因为如果后期需要变更ORM或者出现其他变动的时候,使用特性来标注实体类的话,会导致迁移变得复杂。...,我们无法根据条件进行删除,实际上如果约定泛型T是BaseEntity的子类,我们可以获取到主键,但是这样又会引入另一个泛型,为了避免引入多个泛型根据主键的删除就采用了这种方式。...然后回过头来再实现我们的分页,先添加Utils 到Domain.Implements项目中 cd .....,因为前台传入的参数大多都是字符串的排序字段,所以到后端需要进程字符串到字段的处理。...下一篇,我们将为大家介绍如何优雅的执行SaveChanges方法。 这一篇介绍到这里,虽然说明不是很多,但是这也是我在开发中总结的经验。

    1.6K40

    C#.NET 使用 CommandLineParser 来标准化地解析命令行

    当你运行 git 的时候,你可以在 git 后面加一个谓词(动词),表示执行的是哪一个命令。后面的参数是每个命令都不同的,并且第一个参数是不用指定名称的。...FixSolutionOrProjectFiles(FixOptions options) { return 0; } } } 对于这一段程序,我们可以使用两种不同的谓词来执行命令...每一个 Verb 标记的类别都可以有自己独立的一套命令行参数。 Option 是命名的命令行参数。在命令行中,你必须指定命令行缩写或者全称来指定命令行参数的不同类型。...Value 是命令行的无名参数,它是靠在命令行谓词后面的参数位置来确定解析到哪一个属性上的。...本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

    2K20

    LinQ 查询表达式

    操作方式使用了 LINQ,之前一直对 LINQ 的查询语法不太喜欢,这次使用之后,感觉比方法语法更容易接受,因此详细总结一下查询表达式的语法。 数据查询历来都表示为简单的字符串,没有编译时类型检查。...此外,对于每种数据源,还需要学习不同的查询语言: SQL 数据库、XML 文档以及各种 Web 服务等。借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。...LINQ 最明显的”语言集成”部分就是查询表达式。 使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档以及 .NET 集合中的数据。...join 子句 使用 join 子句可基于每个元素中指定的键之间的相等比较,将一个数据源中的元素与另一个数据源中的元素进行关联和/或合并。在 LINQ 中,联接操作是对元素属于不同类型的对象序列执行。...每个子查询都以自己的 from 子句开头,该子句不一定指向第一个 from 子句中的相同数据源。

    1.9K20

    迭代器模式 与 C# IEnumeratorIEnumerable

    迭代器模式 与 C# IEnumerator/IEnumerable Part1 迭代器模式 与 接口 IEnumerable IEnumerator interface IEnumerable{...使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。...迭代器模式是一种行为设计模式,简单而言,就是将对集合的遍历有“外部控制”变为“内部控制”,将其封装起来。 数组就是将遍历完全交由外部处理。...Iterator模式的几个要点 迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。...一个集合类可以提供多个不同的 GetEnumerator 实现,如 GetEnumerator1,GetEnumerator2,返回不同的 IEnumerator,以实现不同的迭代功能。

    8210

    《ASP.NET Core 微服务实战》-- 读书笔记(第3章)

    以测试优先的方式开发控制器 每一个单元测试方法都包含如下三个部分: 安排(Arrange)完成准备测试的必要配置 执行(Act)执行被测试的代码 断言(Assert)验证测试条件并确定测试是否通过 测试项目...: https://github.com/microservices-aspnetcore/teamservice 特别注意测试项目如何把其他项目引用进来,以及为什么不需要再次声明从主项目继承而来的依赖项...public override string ToString() { return this.LastName; } } } 创建第一个失败的测试...只编写恰好能让测试通过的代码,这样的小迭代作为 TDD 规则的一部分,不光是一种 TDD 运作方式,更能直接提高对代码的信心级别,同时也能避免 API 逻辑膨胀。...$ dotnet restore $ dotnet build $ dotnet test 集成测试 集成测试最困难的部分之一经常位于启动 Web 宿主机制的实例时所需要的技术或代码上,我们在测试中需要借助

    82020

    C#8.0宝藏好物Async streams

    await的本质 .NET诞生之初,就通过IEnumerable、IEnumerator提供迭代能力, 前者代表具备可枚举的性质,后者代表可被枚举的方式。...如果你真的使用强类型IEnumerable/IEnumerator来产生/消费可枚举类型,会发现要写很多琐碎代码。 C#推出的yield return迭代器语法糖,简化了产生可枚举类型的编写过程。...(编译器将yield return转换为状态机代码来实现IEnumerable,IEnumerator) yield 关键字可以执行状态迭代,并逐个返回枚举元素,在返回数据时,无需创建临时集合来存储数据...(编译器将await/async语法糖转换为状态机,产生Task并在内部回调) ☺️以上也看出微软为帮助我们更快速优雅地编写代码,给了很多糖,编译器做了很多事情。...C#提供了迭代、异步的快捷方式,能否将两者结合? 两者结合的效果就是:我们希望在数据就绪时,接收并处理数据,但不会以阻塞cpu的形式等待,这在lot流式数据中很常见。

    97530

    (转载非原创)由ASP.NET Core WebApi添加Swagger报错引发的探究

    示例#     从项目渊源上说起,笔者所在项目,很多都是从.Net FrameWork的老项目迁移到ASP.NET Core上来的,这其中做了很多兼容的处理,来保证尽量不修改原有的业务代码,这其中就包含了...当项目开发完成后,给项目添加Swagger,笔者用的是Swashbuckle.AspNetCore这个组件,添加Swagger的方式大致如下,首先是在Startup类的ConfigureServices...如果想需要更智能的判断Action默认的HttpMethod需要如何定位,直接修改AutoHttpMethodIfActionNoBind扩展方法,因为我们WebApi项目的Action大部分调用方式都是...后续小插曲# 通过上面的方式解决了Swagger报错之后,在后来无意中翻看Swashbuckle.AspNetCore文档的时候发现了IDocumentFilter这个Swagger过滤器,想着如果能通过过滤器的方式去解决这个问题会更优雅...如果你对源码感兴趣,或者有通过看源码解决问题的意识的话,这种方式还是比较有效的,因为我们作为程序员最懂的还是代码,而代码的报错当然也得看着代码解决。

    1.9K00
    领券