首页
学习
活动
专区
工具
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.4K11

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

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

2K30

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

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

1.8K31

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

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

51120

.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库进行动态表达式生成。...,如果不存在则不处理

6310

金三银四面试: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。

4K30

【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 国际许可协议 进行许可。

1.9K20

LinQ 查询表达式

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

1.8K20

《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 宿主机制实例时所需要技术或代码上,我们在测试中需要借助

80020

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流式数据中很常见。

94630

Thinking In Design Pattern——MVP模式演绎

MVP模式由如下三个不同部分组成: 模型表示视图显示或者修改业务数据,包括业务逻辑和领域相关逻辑。 视图通过呈现器显示模型数据,并将用户输入委托给呈现器。...呈现器被视图调用来显示从模型中“拉”出来数据并处理用户输入。 What Is MVP ?...View & Presenter 切换Presenter项目中,添加IHomeView接口,这个接口定义了电子商务网页视图,在首页上显示商品目录以及畅销商品: public interface IHomeView...CategoryProductsPresenter,他与HomePagePresenter相似:从ProductService中获取到分类商品更新视图,但他稍有不同,他要求视图提供CategoryId...,这是一种推得方式(依赖注入)。

798100

Python3 与 C# 并发编程之~ 上篇

BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念(其实之前也有说,所以简说下): 并发:同时做多件事情 多线程:并发一种形式 并行处理:多线程一种...,当你await时候如果有异常会抛出,在第一个await处捕获处理即可 如果 async和 await就是理解不了可以这样想: async就是为了让 await生效(为了向后兼容) 对了,如果返回是...* x); } 其实实际项目中,使用并行时候:任务时间适中,太长不适合,太短也不适合 记得大家在项目里经常会用到如 Sum, Count等聚合函数,其实这时候使用并行就很合适 var list = new...-- 任务并行(并行调用) 这个PLinq好像没有对应方法,有新语法你可以说下,举个例子: await Task.Run(() =>    Parallel.Invoke(        ()...,其实项目里面有流数据相关框架,eg: Spark,都是比较成熟解决方案了基本上也不太使用这些了。

59740

NetCore并发编程

并行处理:多线程一种(线程池产生一种并发类型,eg:异步编程) 响应式编程:一种编程模式,对事件进行响应(有点类似于JQ事件) Net里面很少用进程,在以前基本上都是 线程+池+异步+并行+协程...client.GetStringAsync(url); } catch { } await Task.Delay(nextDelay); // 用异步阻塞方式防止服务器被太多重试给阻塞了...,当你await时候如果有异常会抛出,在第一个await处捕获处理即可 如果 async和 await就是理解不了可以这样想: async就是为了让 await生效(为了向后兼容) 对了,如果返回是...-- 任务并行(并行调用) 这个PLinq好像没有对应方法,有新语法你可以说下,举个例子: await Task.Run(() => Parallel.Invoke( () =>...,其实项目里面有流数据相关框架,eg: Spark,都是比较成熟解决方案了基本上也不太使用这些了。

2.6K40
领券