关于C#中的LINQ的延迟执行

这篇具有很好参考价值的文章主要介绍了关于C#中的LINQ的延迟执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

Linq中的绝大多数查询运算符都有延迟执行的特性,查询并不是在查询创建的时候执行,而是在遍历的时候执行

实例:

 public void Test2()
 {

     List<int> items = new List<int>() { -1, 1, 3, 5 };

     IEnumerable<int> items2 = items.Where(x => x > 0);


     foreach (int item in items2)
     {
         Console.WriteLine(item);
     }
     
     items.Add(40);
     Console.WriteLine("----------------");

     foreach (int item in items2)
     {
         Console.WriteLine(item);
     }

     Console.WriteLine("*****************");
 }

运行结果:

关于C#中的LINQ的延迟执行,.net core,语法,C#,c#,linq

可以看到,执行结果也验证上述的说明,查询创建后,并没有马上执行,而是在遍历对象时才执行,否则第二个遍历不会打印出40.

如果在查询后面添加ToList等转换符,则会立即执行,如

IEnumerable<int> items2 = items.Where(x => x > 0).ToList();
扩展1

上面我们使用时LINQ的API语法,还有一种时查询语法,上面的语句可以改写为:

IEnumerable<int> items3 = from n in items
            where n > 0
            select n;

foreach (int item in items3)
{
    Console.WriteLine(item);
}
            

两种方案区别不大。唯一的区别查询语法允许使用 let 子句,这样,便可以在表达式的作用域内引入和绑定变量,然后在表达式的后续片段中使用该变量。 只使用 API 语法重现相同的代码也是可行的,不过,这很可能会导致代码难以阅读。

扩展2

PLINQ(又称并行 LINQ)是 LINQ 表达式的并行执行引擎。 换言之,LINQ 正则表达式可能会没有意义地在任意数量的线程之间并行化。 为此,可以调用表达式前面的 AsParallel()

上面的代码可以做一下扩展使用并行库执行

IEnumerable<int> items2 = items.AsParallel().Where(x => x > 0);

实例:

  Stopwatch stopwatch = new Stopwatch();

  public  void TestPLINQ()
  {
      
      stopwatch.Restart();

      IEnumerable<int> numbers = Enumerable.Range(3, 10000000 - 3);
      var parallelQuery =
          from n in numbers.AsParallel()
          where Enumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i > 0)
          select n;
      int[] primes = parallelQuery.ToArray();

      
      Console.WriteLine("PLINQ 耗时:" + stopwatch.ElapsedMilliseconds.ToString() + "ms");
      stopwatch.Stop();

  }

  public  void TestLINQ()
  {
      stopwatch.Restart();

      IEnumerable<int> numbers = Enumerable.Range(3, 10000000 - 3);
      var parallelQuery =
          from n in numbers//AsParallel()
          where Enumerable.Range(2, (int)Math.Sqrt(n)).All(i => n % i > 0)
          select n;
      int[] primes = parallelQuery.ToArray();


      Console.WriteLine("LINQ 耗时:" + stopwatch.ElapsedMilliseconds.ToString() + "ms");
      stopwatch.Stop();
  }

执行结果:

关于C#中的LINQ的延迟执行,.net core,语法,C#,c#,linq

可以看到,对于CPU密集型任务,使用PLINQ执行的效率有明显提升。文章来源地址https://www.toymoban.com/news/detail-807720.html

注意1:针对单核CPU来说没有意义。
注意2:对于耗时时间很短的情况,可能LINQ的执行效率会比PLINQ要快,所有使用时要具体情况具体分析。可以将上述的数组大小修改为10000进行测试。

到了这里,关于关于C#中的LINQ的延迟执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EF.Core 使用Linq的Contact联合查询问题

    在.net Core 5 WebAPI 项目中应用 EF Core 5 实体框架,使用Linq的Contact联合进行多表查询。 定义两个子查询语句,查询结果 select 返回的对象结构类型都是一致的。 Linq查询结果集封装对象类: DatingComplaint 实体类映射(Fluent API): 但在执行到 ToListAsync() 代码行查询返回结果时,抛

    2024年02月13日
    浏览(32)
  • C# Lambda,LINQ

    Lambda表达式和LINQ语句都是C#中用于查询和筛选数据的工具,但它们有一些异同点。 异同点: 1. 语法不同: Lambda表达式是一种匿名函数 ,它可以用于创建委托或表达式树。而LINQ语句是一种查询语句,它使用特定的和语法来查询数据。 2. 功能不同: Lambda表达式可以用于

    2024年02月09日
    浏览(309)
  • C# Linq 详解二

    目录 概述 七、OrderBy  八、OrderByDescending 九、Skip 十、Take 十一、Any 十二、All C# Linq 文档(一) 1.Where,2.Select,3.GroupBy,4.First / FirstOrDefault,5.Last / LastOrDefault C# Linq 文档(二) 1.OrderBy ,2.OrderByDescending,3.Skip,4.Take,5.Any,6.All C# Linq 文档(三) 1.Sum / Min / Max / Average,2.Dist

    2024年02月16日
    浏览(30)
  • C# LINQ,SQL

    C#中的LINQ和SQL都是用于查询数据的工具,但它们有以下异同点: 异同点: 1. LINQ和SQL都可以用于查询数据,但LINQ是在C#中使用的语言集成查询,而SQL是一种独立的查询语言。 2. LINQ和SQL都支持基本的查询操作,如选择、过滤、排序和分组。 3. LINQ和SQL都支持连接多个表,但LI

    2024年02月10日
    浏览(27)
  • C# Linq 详解四

    目录 概述 二十、SelectMany 二十一、Aggregate 二十二、DistinctBy 二十三、Reverse 二十四、SequenceEqual 二十五、Zip 二十六、SkipWhile  二十七、TakeWhile C# Linq 文档(一) 1.Where,2.Select,3.GroupBy,4.First / FirstOrDefault,5.Last / LastOrDefault C# Linq 文档(二) 1.OrderBy ,2.OrderByDescending,3.Skip,

    2024年02月16日
    浏览(26)
  • C# Linq 详解一

    目录 一、概述 二、Where 三、Select 四、GroupBy 五、First / FirstOrDefault 六、Last / LastOrDefault C# Linq 文档(一) 1.Where,2.Select,3.GroupBy,4.First / FirstOrDefault,5.Last / LastOrDefault C# Linq 文档(二) 1.OrderBy, 2.OrderByDescending,3.Skip,4.Take,5.Any,6.All C# Linq 文档(三) 1.Sum / Min / Max / Av

    2024年02月16日
    浏览(27)
  • C# Linq 详解三

    目录 概述 十三、Sum / Min / Max / Average 十四、Distinct 十五、Concat 十六、Join 十七、ToList  十八、ToArray 十九、ToDictionary C# Linq 文档(一) 1.Where,2.Select,3.GroupBy,4.First / FirstOrDefault,5.Last / LastOrDefault C# Linq 文档(二) 1.OrderBy ,2.OrderByDescending,3.Skip,4.Take,5.Any,6.All C# Linq 文

    2024年02月16日
    浏览(23)
  • C#中LINQ的使用知多少?LINQ常功能整理,实例源代码解析

      LINQ(Language-Integrated Query)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合、数据库、XML等。下面详细描述了LINQ的20个功能点,并提供了相应的源代码。 查询集合中的所有元素: 使用条件过滤集合中的元素:

    2024年02月05日
    浏览(42)
  • 【C# 基础精讲】LINQ 基础

    LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概念、常见的LINQ操作和示例,以及如何在C#中利用LINQ进行数

    2024年02月12日
    浏览(27)
  • C#高级编程 Linq介绍

    本文对C#高级编程部分的Linq查询进行介绍 目录 一、Linq起源 二 LINQ 操作组成 2.1数据源 2.2查询 3.3查询执行

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包