高效的LINQ语句(三)

C# LINQ 在数据处理中的高效应用 摘要: LINQ(Language Integrated Query)是C#中强大的数据查询技术,它简化了集合数据的操作方式,可提升代码可读性和开发效率。然而,在大规模数据处理时,需注意性能优化,如区分延迟执行与即时执行、选择合适的LINQ方法以减少计算开销,并通过索引或字典优化查找效率。此外,避免不必要的内存分配、合理使用并行LINQ(PLINQ)以及合并查询条件,均可提升性能。本文探讨了LINQ的高效应用策略,帮助开发者在简化代码的同时兼顾性能优化。 阅读详情

Model层的类如下:

  public class Order
    {
        public int Id { get; set; }
        public decimal Amount { get; set; }
        public string CustomerName { get; set; }
        public string Status { get; set; }
    }
 public  class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
Program.cs代码如下:

 class Program
    {
        //AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。
        //线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程,通过调用 Set 发出资源可用的信号。
        //调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
        //可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

        //通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。
        private static AutoResetEvent autoSet = new AutoResetEvent(false);


        private static List<Person> list = new List<Person>()
        {
            new Person() {Name = "Rose", Age = 19},
            new Person() {Name = "Steve", Age = 45},
            new Person() {Name = "Jessica", Age = 20},
        };


        private static void Main(string[] args)
        {
            //CheckOrders();
            //Common();
            //RemoveFromList();
            //ExceptionHandling();
            //-----------------------------------------------------------------
            //--------------------------------模拟非线程安全----------------------------

            Thread t1 = new Thread(() =>
            {
                //确保等待t2开始之后才运行下面的代码
                autoSet.WaitOne();
                foreach (var item in list)
                {
                    Console.WriteLine("t1:" + item.Name);
                    Thread.Sleep(1000);
                }
            });
            t1.Start();
            Thread t2 = new Thread(() =>
            {
                //通知t1可以执行代码
                autoSet.Set();
                //沉睡1秒是为了确保删除操作在t1的迭代过程中
                Thread.Sleep(1000);
                list.RemoveAt(2);
            });
            t2.Start();

            Console.ReadKey();
        }

        public static void CheckOrders()
        {
            List<Order> orders = new List<Order>()
            {
	            new Order { Id = 123, Amount = 29.95m, CustomerName = "Mark", Status = "Delivered" },
	            new Order { Id = 456, Amount = 45.00m, CustomerName = "Steph", Status = "Refunded" },
	            new Order { Id = 768, Amount = 32.50m, CustomerName = "Claire", Status = "Delivered" },
            };

            bool anyRefunded = orders.Any(o => o.Status == "Refunded");
            if (anyRefunded)
            {
                Console.WriteLine("There are refunded orders");
            }
            else
            {
                Console.WriteLine("No refunds");
            }

            bool allDelivered = orders.All(o => o.Status == "Delivered");
            if (allDelivered)
            {
                Console.WriteLine("Everything was delivered");
            }
            else
            {
                Console.WriteLine("Not everything was delivered");
            }
        }

        public static void Common()
        {
            //距离圣诞节的天数
            var daysToChristmas = (new DateTime(DateTime.Today.Year, 12, 25) - DateTime.Today).TotalDays;
            Console.WriteLine(daysToChristmas);

            //-----------------------------------------------------------------
            int SUM = "10,5,0,8,10,1,4,0,10,1"
                .Split(',')
                .Select(int.Parse)
                .OrderBy(n => n)
                .Skip(3)
                .Sum();
            Console.WriteLine(SUM);
            //-----------------------------------------------------------------
            var customers = new[] {
	            new { Name = "Annie", Email = "annie@test.com" },
	            new { Name = "Ben", Email = "" },
	            new { Name = "Lily", Email = "lily@test.com" },
	            new { Name = "Joel", Email = "joel@test.com" },
	            new { Name = "Sam", Email = "" },
            };
            foreach (var customer in
                from c in customers
                where !String.IsNullOrEmpty(c.Email)
                select c)
            {
                Console.WriteLine("Sending email to {0}", customer.Name);
            }
            //效果同上
            foreach (var customer in customers.Where(c => !String.IsNullOrEmpty(c.Email)))
            {
                Console.WriteLine("Sending email to {0}", customer.Name);
            }
        }

        public static void RemoveFromList()
        {
            Func<List<string>> makeList = () => Enumerable.Range(1, 10000000).Select(n => ("Item " + n + "")).ToList();
            var itemsToRemove = new[] { "Item 0", "Item 1", "Item 50", "Item 1000", "Item 999999", "Item 9999999" };
            var stopwatch = new Stopwatch();
            var list = makeList();

            stopwatch.Start();
            foreach (var item in itemsToRemove)
            {
                list.Remove(item);
            }
            stopwatch.Stop();

            Console.WriteLine(list.Count + "Foreach took {0}ms", stopwatch.ElapsedMilliseconds);

            list = makeList();


            stopwatch.Restart();
            var newList = list.Except(itemsToRemove).ToList(); //效率极低
            stopwatch.Stop();

            Console.WriteLine(newList.Count + "Except took {0}ms", stopwatch.ElapsedMilliseconds);
        }


        public static void ExceptionHandling()
        {
            var numbers = Enumerable.Range(1, 10)
                    .Select(n => 5 - n)
                    .Select(n =>
                    {
                        try
                        {
                            return 10 / n;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("Error in lambda: " + e.Message);
                            return -1;
                        }
                    });

            foreach (var n in numbers)
            {
                Console.WriteLine(n);
            }
        }

    }




程序员的日常利器:高效使用 LINQ 提高代码质量 LINQ 是 C# 中一项强大的功能,它使得数据查询变得简单、清晰和高效。然而,要高效地使用 LINQ,我们需要掌握一些最佳实践和性能优化技巧。通过合理使用。 阅读详情

相关推荐

C# 与 LINQ:数据查询与处理的高效实践

LINQ 是 C# 中一项非常强大的特性,它让开发者能够以一种简洁、声明式的方式进行数据查询和处理。通过 LINQ,开发者不仅能够减少冗长的代码,还能够提高数据处理的效率和可读性。本文介绍了 LINQ 的基本概念与常用操作,并通过不同的数据结构展示了 LINQ 的实际应用场景。掌握 LINQ 的使用,将大大提升数据处理的效率和代码的简洁性,是每个 C# 开发者必须掌握的重要技能之一。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1241

.net5下使用EPPlus导出Excel(复杂表头)

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; using OfficeOpenXml; using OfficeOpenXml.Style; namespace HZCC.Common { public class ExcelHelper { /// <summary&g.

Hello World 1225

C# LINQ(一)概况

在LINQ前,先回顾下集合:集合基于ICollection、IList、IDictionary、IEnuerable接口及其泛型版本,例如IEnuerable&lt;T&gt;,IList和IDictionary均从ICollection接口派生,而ICollection接口又从IEnumerable接口派生。而泛型版本IEnumerable&lt;T&gt;也派生自IEnumerable,相当于...

bakalr的专栏 6745

适用于.net的操作excel的库

前三个库都是比较好用且使用比较多的,且开源跨平台,推荐使用前三种,稳定,使用起来也放心,易于维护。使用方法大差不差,但是还是需要注意个别差异,比如单元格行、列Index有的是从1开始,而有的是从0开始......

hua_chi的专栏 2488

MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南

本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pip和OpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。

weixin_29102619的博客 263

MATLAB创建GUI面板实现二维码生成与识别

利用matlab设计gui界面实现二维码的生成与内容识别

infinitystardust的博客 3148

【亲测免费】 EPPlus:Excel 数据处理的新星

是一个开源的 .NET 库,它为处理 Excel 文件提供了强大的功能,无需 Microsoft Excel 安装即可实现高效的数据导入和导出。这篇文章除了详细介绍 EPPlus 的基本概念,还会对其技术特性、应用场景及优势进行剖析,帮助开发者更好地理解和利用这一工具。 ## 项目简介 EPPlus 提供了一个直观且高性能的 API,可以创建、修改和读取 `.xlsx` 格式的 Excel 文...

gitblog_00041的博客 1087

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

【DMA】认识 DMA 及其工作流程(与传统CPU存取方式的区别)

challenglistic的博客 5万+

.NET平台开源文档与报表处理组件集合

.NET平台开源文档与报表处理组件集合 2015-07-13架构师联盟 文档处理在开发中是一个非常常见的任务了,例如导出Excel,导出Word,生成PDF报表等等。那今天就看看下面这些.NET开源项目你知道不?如果有用,千万不要忘记推荐哦。同时个人能力有限,希望大家补充。 1.Excle神器NPOI NPOI 是 POI 项目的...

weixin_30410119的博客 342

13-单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊【单片机,物联网,上位机】: 说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系! 说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。 说明3:学会以后,下面的代码可能会跟你一辈子! 说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程! 拷贝这两个文件到自己的工程 ..

杨奉武的博客 1280

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制(PCM)ADC受到了制造工艺的限制,无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺下实现高分辨率(大于16位),同时由于结构简单,所以易于实现。低成本高性能使得Delta-Sigma调制技术得到了广泛的应用。 Delta-Sigma型ADC的结构原理图如下图所示: 它最大的优势在于仅用1位ADC进行数据转换,同时其模拟电路部分结构简单不需要

阿星的博客 2万+

使用phpoffice/phpexcel拓展读取excel内容卡死解决

今天一个线上项目反应导入excel文件时,网页直接卡死,导入excel文件时失败,经过一步一步的验证发现是在读取excel文件时卡死,此项目使用的是phpoffice/phpexcel拓展,最后发现是在执行load方法加载excel文件时出现卡死,之前在导入excel文件一直是正常的,而且excel中的数据也不是很多,到底是由于什么原因造成的呢? 最后在查找phpoffice/phpexcel官方文档中发现,这是由于excel文件中存在了某些特殊字符导致了加载excel文件时崩溃,既然找到了原因,就一定有

huaweichenai的博客 1419

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1243

C#的linq语句

 /查询表达式必须以form子句开头,以select或者group子句结束,在这两个子句之间,可以使用         ///where 、orderby、join、let和其他的from子句 本章要点 用列表在对象上执行传统查询 扩展方法 LINQ查询操作符 平行LNQ 表达式树 本章源代码下载地址( wrox. com ) ...

火麒马 3784

Swin Transformer注意力计算复杂度为何比全局注意力少那么多?

本文对比分析了Vision Transformer(ViT)和Swin Transformer的计算复杂度。ViT采用全局注意力机制,计算复杂度为4[hwc^2]+2[(hw)^2C],当图像尺寸较大时计算量显著增加。而Swin Transformer采用窗口注意力机制,将图像划分为M×M的窗口(如7×7),计算复杂度降为4[hwc^2]+2[(hw)(M*M)*C]。以224×224图像为例,Swin Transformer的计算量比ViT减少约900倍,大幅节省了计算资源。文章通过矩阵乘法运算详细推导了

人工智能研究所的博客 62

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

LINQ查询语句

本文讨论的是使用C#,VB.NET及其他.NET语言下使用LINQ进行查询的方法,文中所给的代码都是C#。 LINQ是在.NET Framework3.5以后才引入的一种快速查询语句。在Linux系统中使用Mono2.0也支持LINQ语句。

duanhy的专栏 1791

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#之linq语句与Debug调试

/ 实现 Batch 分块操作符// 实现 Batch 分块操作符 public static IEnumerable < IEnumerable < T > > Batch < T >(this IEnumerable < T > source , int batchSize) {i ++) {} } } // 使用示例 public static void CustomOperatorDemo() {} /* 输出:*/ }

Major_S的博客 1335

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C#进阶之LINQ(2)Linq查询语句与查询方法

(一)Linq基础 1)Linq解决的问题 面向对象编程语言与数据访问方法长期分离,以嵌入式的方式开发,例如: 编程语言中的数据类型与数据库中的数据类型形成两套体系,如:C#中的字符串string 在SQL中使用NVarchar/ Varchar/ Char来表示; SQL和XML都有各自的查询语言,而对象没有自己的查询语言,如要从List<>集合或者数组中找到符合要求的元素,非常...

forever_008的博客 9810

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【C#】System.Linq,万能的查询语句

首先是官方文档: https://docs.microsoft.com/zh-cn/dotnet/api/system.linq?view=netframework-4.7.2https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable?view=netframework-4.7.2 合理的使用System.Linq类库...

萧然 1万+

C#进阶-LINQ表达式总结

本篇文章是LINQ的使用教程,用LINQ模仿对应SQL语句的执行效果。LINQ是一款很常用的扩展包,支持C#和Java,在系统进行查询数据的动作时,相较于执行数据库层面的SQL语句,后端层面的LINQ运行起来会更加高效稳定,可以极大缩短每次与数据库交互的时间,增加系统功能的稳定性,提高查询效率。

踏雨歌青春,诗酒趁年华 4842

C#之Linq语句

Linq是一种查询语句,C#中可以用这种语句做集合和数据库查询。 新建一个Student类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { ...

温大侠的博客 2201

LINQ详解

LINQ (Language Integrated Query) 是微软在 .NET Framework 3.5 中引入的一种功能,它允许开发人员使用类似于SQL的语法来查询内存中的数据集合。LINQ 不仅限于查询数据库,还可以用来查询任何数据源,包括 XML 文档、ADO.NET 数据集、对象集合等。LINQ 的主要优点在于其简洁的语法和与 C# 的深度集成,使得数据查询更加直观和高效。

敲厉害的燕宝的博客 4081

[转]LINQ体验(4)——LINQ简介和LINQ语句之Where

查询表达式(LINQ)简介在上两篇我介绍了C#3.0新语特性和改进,这些新特性在我们编写程序时为我们提供了非常大的帮助。从这篇开始,我们开始一起来探讨LINQ。LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好

菩提树下的杨过 1154

LINQ 全解析:让你的C#代码更优雅高效

LINQ是.NET中强大的语言集成查询工具,支持统一语法查询多种数据源。它具有两种语法风格(查询语法和方法语法),支持筛选、投影、排序等常见操作,并具有延迟执行特性。LINQ可与EF Core结合进行数据库查询,还提供SelectMany、Join等高级功能。使用中需注意常见误区(如延迟执行问题)和优化建议(避免多次枚举)。文章详细介绍了15种常用LINQ操作,包括Where、Count、GroupBy等,并推荐LINQPad工具和微软官方文档作为学习资源。

R3333355726856的博客 1094

C# LINQ(LINQ to XML)

可扩展标记语言(XML)是存储和交换数据的重要方法。LINQ为该语言增加了一些特性,使得XML用起来比XPath和XSLT等方法容易得多。如果你熟悉这些方法的话,会很高兴LINQto XML在许多方面简化了XML的创建、查询和操作。尽管本书不会完整介绍XML,但是在介绍LINQ提供的一些XML操作特性之前,会先简单介绍一下XML。

钢铁男儿 1216
上一篇: 高效的LINQ语句(二)
下一篇: Nodejs使用tedious驱动模块连接SqlServer
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值