前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 中的查询

C# 中的查询

作者头像
Karl Du
发布于 2023-10-20 10:57:56
发布于 2023-10-20 10:57:56
34600
代码可运行
举报
文章被收录于专栏:Web开发之路Web开发之路
运行总次数:0
代码可运行

本文将介绍C#一种非常重要的数据处理方式——查询。例如我想筛选产品中大于10美元的产品,那么C#不同版本都是如何完成查询的呢?

C# 1

C# 1没有什么技巧,我们需要在循环里判断价格,实现方式非常通俗易懂,但是代码又长又不够美观

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;

namespace Demo
{
    static void Main(string[] args)
    {
        ArrayList products = Product.GetProducts();
        foreach(Product item in products)
        {
            if (item.Price > 10)
            {
                Console.WriteLine(item.Name);
            }
        }
    }
}

C# 2

C# 2稍微进行了一点改进,变量test的初始化使用了匿名方法,而print变量的初始化使用了C# 2的另一个特性——方法组转换,它简化了从现有方法创建委托的过程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Product> products = Product.GetProducts();

            Predicate<Product> test = delegate (Product p) { return p.Price > 10m; };
            List<Product> matches = products.FindAll(test);

            Action<Product> print = Console.WriteLine;
            matches.ForEach(print);

            Console.ReadKey();
        }
    }
}

上述代码并没有比C# 1简单,但是它强大了很多

具体地说,它使我们可以非常轻松地更改测试条件并对每个匹配项采取单独地操作。涉及的委托变量(testprint)可以传递给一个方法——相同的方法可以用于测试完全不同的条件以及执行完全不同的操作。当然,可以将所有测试和打印都放到一条语句中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Product> products = Product.GetProducts();
products.FindAll(delegate (Product p) { return p.Price > 10m; })
        .ForEach(Console.WriteLine);

这样更好一些,但是delegate(Product p)还是很爱是,大括号也是。它们是代码中不和谐音符,有损可读性。如果一直进行相同的测试和执行相同的操作,我还是喜欢C# 1的版本。

C# 3

C# 3拿掉了以前将实际的委托逻辑包裹起来的许多无意义的东西, 从而有了极大的改进

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Product> products = Product.GetProducts();
foreach(Product product in products.Where(p => p.Price > 10m))
{
    Console.WriteLine(product);
}

Lambda表达式将测试放在了一个非常恰当的位置。再加上一个有意义的方法名,你甚至可以大声读出代码,几乎不用怎么思考就能明白代码的含义。C# 2的灵活性也得到了保留——传递给Where的参数值可以来源于一个变量。此外,如果愿意,完全可以使用Action<Product>,而不是硬编码的Console.WriteLine调用

总结

C# 2中的匿名方法有助于问题的可分离性;C#中,Lambda表达式则增加了可读性

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/05/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《C#图解教程》读书笔记之五:委托和事件
  (1)本质:持有一个或多个方法的对象;委托和典型的对象不同,执行委托实际上是执行它所“持有”的方法。如果从C++的角度来理解委托,可以将其理解为一个类型安全的、面向对象的函数指针。
Edison Zhou
2018/08/20
5740
《C#图解教程》读书笔记之五:委托和事件
C#一分钟浅谈:Lambda 表达式和匿名方法
在C#编程中,Lambda表达式和匿名方法都是定义没有名称的方法的方式,它们使得代码更加简洁和易于维护。本文将从基础概念入手,逐步深入探讨这两者的区别与联系,并通过具体示例帮助理解。
Jimaks
2024/09/09
3250
深入分析委托与事件—C#综合揭秘——细说多线程
本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单。 还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单。 在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用。 最后一节,将介绍Predicate<T>、Action<T>、Func<T,TResult>多种泛型委托的使用和Lambda的发展过程与其使用方式。 因为时间仓促,文中有错误的地方敬请点评。
vv彭
2021/01/06
2.2K0
C#语法之糖有点甜,语法之美很迷人
语法糖的出现绝对是广大码农的福音,为什么叫语法糖?简而言之就是你之前需要写10行代码,现在一行代码就可以搞定并且效率还不下降,你说甜不甜,鸡腿香不香?语法糖能够增加程序的可读性,从而减少程序代码出错的机会。下面介绍一下C#新增或者常用的语法糖。
苏州程序大白
2021/08/13
1.2K0
C#语法之糖有点甜,语法之美很迷人
Linq基础知识小记一
1、LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据。广义的数据包括XML文档数据、元数据、System.Data.dll和System.Data.SqlClient.dll提供的DataSet和DataTable等数据、内存数据(Array、Collection)等. 2、Linq To Object是针对实现了IEnumerable<T>的对象操作或获取数据的功能,代码如下: (1)、通过Enumerable的实例方法实现查询 string[] str
郑小超.
2018/01/26
5940
每个.NET开发都应掌握的C#委托事件知识点
上篇文章讲述了C#接口的知识点,本文将介绍C#委托事件知识点。C#作为.NET开发的核心语言之一,提供了丰富的特性来支持面向对象编程和事件驱动的模型。其中,委托和事件是C#中不可或缺的关键概念,每个.NET开发者都应该深入理解它们的作用和用法。委托和事件密不可分,所以本文将委托和事件的知识点一起介绍,并通过一些示例来帮助开发者更好地掌握这些重要的概念。
郑子铭
2023/08/30
3160
每个.NET开发都应掌握的C#委托事件知识点
C#基础篇 - 理解委托和事件
委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。很多情况下,某个函数需要动态地去调用某一类函数,这时候我们就在参数列表放一个委托当做函数的占位符。在某些场景下,使用委托来调用方法能达到减少代码量,实现某种功能的用途。
Esofar
2018/09/05
5570
C#基础篇 - 理解委托和事件
开心档之C# 匿名方法
我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。
iOS Magician
2023/04/23
2140
盘点3个流行的C#脚本开源引擎
CS-Script是非常成熟的C#脚本引擎,自2004年起就发布了,即.NET发布后的两年。
郑子铭
2025/04/19
1690
盘点3个流行的C#脚本开源引擎
C#中的Lambda表达式
在看C#中的Lambda表达式之前,先来看一个概念:匿名方法。学过Java的亲们,可能对这个概念比较了解。Java JDK8中也引入了Lambda表达式。
卡尔曼和玻尔兹曼谁曼
2019/01/25
8570
C#中的Lambda表达式
【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式
C#高级主题涉及到更复杂、更灵活的编程概念和技术,能够让开发者更好地应对现代软件开发中的挑战。其中,LINQ查询和表达式是C#高级主题中的一项关键内容,具有以下重要性和优势:
喵叔
2023/08/21
2.9K0
C#规范整理·泛型委托事件
基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用。事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分。
郑子铭
2023/08/30
3090
C#规范整理·泛型委托事件
编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
  泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能。基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用。事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分。一旦我们开始编写稍微复杂的C#代码,就肯定离不开泛型、委托和事件。本章将针对这三个方面进行说明。
aehyok
2018/08/31
4830
编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
开篇:在上一篇中,我们了解了匿名类、匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式。为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型。预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来!
Edison Zhou
2018/08/20
9370
.NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
Linq快速入门——Lambda表达式的前世今生
Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托。 何为委托 匿名方法 Lambda表达式 扩展方法 泛型委托 A Simple Lambda Demo Lambda表达式树 何为委托 委托非常好理解,类似于C++里面的函数指针(指向了一个方法),并且委托约束了待指向方法的签名(由返回类型和参数组成)。 using System; using System.Collections.Generic; using Syst
用户1161731
2018/01/11
1.4K0
Linq快速入门——Lambda表达式的前世今生
C#中的匿名类型
在C#中,我们可以不去显示的声明一个类,而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。
宿春磊Charles
2022/12/03
9500
C#中的匿名类型
C# 中的排序
排序是开发中非常常见的场景,我们在不同的C#版本该如何实现排序呢?本文通过讲解C# 1到C# 3不同的实现方案来帮助大家清晰的了解 C# 进化的过程。
Karl Du
2023/10/20
2940
C# 中的排序
C#学习笔记 lambda表达式
在使用委托的时候,除了将一个已存在的方法赋给一个委托之外,还可以使用匿名方法的方式。使用匿名方法的时候,需要一个delegate关键字,并且方法的参数列表要和委托定义的完全一样。
乐百川
2022/05/05
4010
C# Lambda表达式详解,及Lambda表达式树的创建
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!
zls365
2021/02/26
9290
LINQ常用扩展方法、委托、Lambda、yield
 每一项数据都会经过predicate的测试,如果针对一个元素,predicate执行的返回值为true,那么这个元素就会放到返回值中。 Where参数是一个lambda表达式格式的匿名方法,方法的参数e表示当前判断的元素对象。参数的名字不一定非要叫e,不过一般lambda表达式中的变量名长度都不长。
鱼找水需要时间
2024/03/23
1830
相关推荐
《C#图解教程》读书笔记之五:委托和事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验