广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C# LINQ查询表达式及对应LAMBDA表达式的用法
  • 384
分享到

C# LINQ查询表达式及对应LAMBDA表达式的用法

2024-04-02 19:04:59 384人浏览 泡泡鱼
摘要

目录首先先让我们看一下什么是LINQ查询表达式和Lambda表达式:什么是“延迟执行”?还是上面例子中的查询:并行linqC#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段

C#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于VS编译器的加持)用起来非常舒服,而且对于C#我觉得他最优美之处不仅仅是语法糖方面还有就是体现在LINQ和Lambda表达式。

本篇文简单介绍一下关于C#当中LINQ表达式和其对应的Lambda表达式的用法,关于这两部分内容的相关参考资料:

人民邮电出版社《C#程序设计及应用教程》(第3版)

博客:《c# Linq查询》

同时在介绍的时候我会尽量挑出重要部分同时加上我自己的理解和认识,如有偏差还请指教。

首先先让我们看一下什么是LINQ查询表达式和Lambda表达式:

运行结果:

以上是对LINQ查询表达式和Lambda表达式的一个简单的应用,都是查询stu列表中年龄大于等于20岁的结果并且把结果按照年龄降序排列。

由此可见Linq表达式和Lambda表达式并没有什么可比性,只是用Lambda可以实现LINQ的查询语句。

那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在《深入理解C#》中称其为“点标记”。

例子中主要以LINQ表达式为主,LINQ表达式结构更为清晰易于理解,同时也会给出对应的点标记写法(所有的LINQ查询表达式都可以转成对应的点标记。反之,不是所有的点标记都可以转成查询表达式。),所以如果想要了解这部分的读者也请往下看。本文会介绍LINQ查询表达式用法以及对应的Lambda表达式。

LINQ查询表达式是一组查询技术的统称,其主要思想是将各种查询功能直接集成到C#语言中,不论是对象、XML、还是数据库都可以用LINQ编写查询语句。LINQ与传统迭代技术实现的查询优势在于更简明、更易读这种优势特别是在筛选多个条件时更为显著;使用很少的程序代码便能实现复杂的查询和筛选;无需修改或者是进行很少的修改就能移植到其它的数据源。LINQ查询语句并不复杂并且与sql语句有些类似,学习起来难度并不大。

接下来直接看LINQ查询例子:


//以下为例子中涉及查询的数据
List<Student> stu = new List<Student>()
{
  new Student(){Id = 1,Name = "王同学",Age = 24},
  new Student(){Id = 2,Name = "王同学",Age = 30},
  new Student(){Id = 3,Name = "王同学",Age = 21},
  new Student(){Id = 4,Name = "赵同学",Age = 20},
  new Student(){Id = 5,Name = "钱同学",Age = 22},
  new Student(){Id = 6,Name = "孙同学",Age = 23},
  new Student(){Id = 7,Name = "周同学",Age = 23},
   new Student(){Id = 8,Name = "吴同学",Age = 20},
  new Student(){Id = 9,Name = "郑同学",Age = 25},
  new Student(){Id = 10,Name = "蒋同学",Age = 26}
};

查询年龄是30岁的王同学的信息:


//查询年龄是30岁的王同学的信息
var res = from t in stu
    where t.Name == "王同学" && t.Age == 30
    select t;

//对应的Lambda表达式
//var res1 = stu.Where(t => t.Age == 30 && t.Name == "王同学");

foreach (var item in res)//显示查询结果
{
    Console.Write("学号:"+item.Id+"\n姓名:"+item.Name+"\n年龄:"+item.Age);
}

运行结果:

LINQ查询表达式必须以fORM子句开头,并且必须以select或group子句结尾。在第一个from子句和最后一个select或group子句之间,查询表达式可以包含一个或者多个where、orderby、join、let甚至附加from子句。LINQ表达式整体的用法和SQL语句很像,在上面的例子中就可以看出。

上面的例子的含义就是从数据源stu中查询一个数据“t”,“t”满足的条件就是它的Name是王同学同时它的Age是30,然后查询这个“t”。LINQ查询语句的返回值类型为IEnumerable<T>,LINQ执行查询时,一般利用foreach循环执行查询得到一个序列,这这种方式称为“延迟执行”。

什么是“延迟执行”?还是上面例子中的查询:


//查询年龄是30岁的王同学的信息
var res = from t in stu
    where t.Name == "王同学" && t.Age == 30
    select t;
//var res1 = stu.Where(t => t.Age == 30 && t.Name == "王同学");Lambda表达式写法

foreach (var item in res)
{
    Console.Write("学号:"+item.Id+"\n姓名:"+item.Name+"\n年龄:"+item.Age);
}

Console.WriteLine("\n--------------------------------------------------------------------------");

stu.Add(new Student(){Id = 11,Name = "王同学",Age = 30});

foreach (var item in res)
{
    Console.Write("学号:" + item.Id + "\n姓名:" + item.Name + "\n年龄:" + item.Age);
    Console.WriteLine();
}

运行结果:

延迟查询就是只需构造一次查询语句,可以多次使用。在List中添加新元素之后并没有重新执行查询操作,然而res中的结果却根据List中元素的改变相应发生了改变。

从学生中选出年龄小于25岁并且按照年龄降序排列


//从学生中选出年龄小于25岁并且按照年龄降序排列
var res = from t in stu
    where t.Age < 25
    orderby t.Age descending
    select t;
//var res1 = stu.Where(t => t.Age < 25).OrderByDescending(t => t.Age).Select(t => t);Lambda写法

foreach (var item in res)
{
    Console.Write("学号:" + item.Id + "\n姓名:" + item.Name + "\n年龄:" + item.Age);
    Console.WriteLine();
}

运行结果:

从学生中查询姓王的同学的信息并且按照年龄降序排列


//从学生中查询姓王的同学的信息并且按照年龄降序排列
var res = from t in stu
    from n in t.Name
    where n == '王'//名字中带有王字
    orderby t.Age descending
    select t;
//var res1 = stu.Where(t => t.Name.IndexOf("王") == 0).OrderByDescending(t => t.Age);lambda表达式

foreach (var item in res)
{
    Console.Write("学号:" + item.Id + "\n姓名:" + item.Name + "\n年龄:" + item.Age);
    Console.WriteLine();
}

运行结果:

学生信息按照年龄、Id进行排序


//参数越靠前,优先级越高
//先按age排序,当分数相同时再按id排序...依次类推

 var res = from t in stu
    orderby t.Age, t.Id
    select t;
//var res1 = stu.OrderBy(t => t.Age).ThenBy(t => t.Id);Lambda表达式

foreach (var item in res)
{
    Console.Write("学号:" + item.Id + "\n姓名:" + item.Name + "\n年龄:" + item.Age);
    Console.WriteLine();
}

运行结果:

按照年龄进行分组,查询相同年龄数量大于2的内容


//按照年龄进行分组,查询相同年龄数量大于2的内容
var res = from t in stu
    group t by t.Age into s
    where s.Count()>=2
    select s;
//var res1 = stu.GroupBy(t => t.Age).Where(s => s.Count() >= 2);lambda表达式

foreach (var item in res)
{
    foreach (var items in item)
    {
        Console.Write("学号:" + items.Id + "\n姓名:" + items.Name + "\n年龄:" + items.Age);
        Console.WriteLine();
    }
    Console.WriteLine();
}

运行结果:

查询出集合qSt中year等于集合qSc中year的元素并形成新的集合


List<s> pSt = new List<s>();
pSt.Add(new s() { year = 1999, name = "小张" });
pSt.Add(new s() { year = 2000, name = "小王" });
pSt.Add(new s() { year = 2001, name = "小李" });
pSt.Add(new s() { year = 2010, name = "小赵" });
List<school> pSc = new List<school>();
pSc.Add(new school() { year = 1999, name = "aaa" });
pSc.Add(new school() { year = 2001, name = "bbb" });
pSc.Add(new school() { year = 2002, name = "ccc" });
pSc.Add(new school() { year = 2010, name = "DDD" });
pSc.Add(new school() { year = 2012, name = "fff" });

var res = from t1 in pSc
     from t2 in pSt
    where t1.year == t2.year
    select new {year = t1.year, name = t1.name + t2.name};

foreach (var item in res)
{
    Console.Write("年:" + item.year + "姓名:" + item.name);
    Console.WriteLine();
}

运行结果:

并行linq

并行查询可以分解查询的工作,使其分布在多个线程上。当pc拥有多个cpu时,可以看到并行查询带来的改进效果。并行LINQ适用于大型的集合查询,并拥有一定的优势。使用System.Collections.Concurrent.Partitioner.Create可以手动创建分区器。可以粗鲁的认为并行linq对于大集合的查询是优势比较明显的。取消长时间运行的并行linq查询可以设置利用System.Threading.CancellationTokenSource设置取消操作。


Console.WriteLine("开始构造大数组...");
//构造大数组
const int count = 100000000;
var data = new int[count];
var r = new Random();
for (int i = 0; i < count; i++)
{
    data[i] = r.Next(40);
}
Console.WriteLine("开始计算...");
var st = System.DateTime.Now;
var sum = (from x in data where x > 20 select x).Sum();//常规linq-耗时1.8641s
var st2 = System.DateTime.Now;
var sum2 = (from x2 in data.AsParallel() where x2 > 20 select x2).Sum();//并行查询-耗时0.6620s

 //var sum3 = data.AsParallel().Where(x3 => x3 > 20).Sum();//或并行查询----x3 => x3 > 20(Lambda表达式)
var st3 = System.DateTime.Now;

 

var sum4 = (from c in System.Collections.Concurrent.Partitioner.Create(data, true).AsParallel() where c > 20 select c).Sum();

var dt1 = st2 - st;
var dt2 = st3 - st2;
Console.WriteLine("常规linq耗时:{0}s", dt1.TotalSeconds.ToString());
Console.WriteLine("并行linq耗时:{0}s", dt2.TotalSeconds.ToString());
Console.ReadKey();

运行结果:

写在最后,如果你对以上LINQ以及对应的Lambda的使用方法都已经了解那你已经初步了解了LINQ查询表达式和Lambda表达式,这里需要说明的一点是关于Lambda的使用方法并不仅仅只限于进行查询,他是一个主要用于简化委托的代码编写形式,他用法远比文中介绍的更加广泛,本文是为了对比展现LINQ和Lambda。

以上就是C# LINQ查询表达式及对应LAMBDA表达式的用法的详细内容,更多关于C# LINQ查询表达式及LAMBDA表达式的资料请关注编程网其它相关文章!

--结束END--

本文标题: C# LINQ查询表达式及对应LAMBDA表达式的用法

本文链接: https://www.lsjlt.com/news/123423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# LINQ查询表达式及对应LAMBDA表达式的用法
    目录首先先让我们看一下什么是LINQ查询表达式和Lambda表达式:什么是“延迟执行”?还是上面例子中的查询:并行linqC#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段...
    99+
    2022-11-12
  • C++中的Lambda表达式及表达式语句
    目录一、概念二、左值与右值三、类型转换四、操作符五、思考1、思考下面x变量是左值还是右值,有什么特性?2、思考一下以下赋值操作符的原始代码是怎样的?3、思考以下代码做了什么事情?一、...
    99+
    2022-11-12
  • LINQ查询表达式怎么用
    这篇文章主要介绍了LINQ查询表达式怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。from子句负责指定LINQ查询操作中的数据源和范围变量每一个LINQ查询表达式都必须...
    99+
    2023-06-17
  • C#中Lambda表达式的用法
    从C#3.0开始,可以使用lambda表达式把实现代码赋予委托。lambda表达式与委托(https://www.jb51.net/article/244051.htm)直接相关。当...
    99+
    2022-11-13
  • Linq查询表达式是怎么样的
    这篇文章给大家分享的是有关Linq查询表达式是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linq查询表达式于是,语言设计团队设计了一种与 SQL 更为相近的语法,称为Linq查询表达式。例如,针对我们...
    99+
    2023-06-17
  • c#中查询表达式GroupBy的使用方法
    说明: c#中实现IEnumerable<T>接口的类提供了很多扩展方法,其中Select,Where等为最常见的,且几乎和Sql语法类似比较好理解,基本满足了...
    99+
    2022-11-12
  • C#中Lambda表达式的三种写法
    一、历史版本 delegate void StudentDelegate(string name, int age); public class LambdaTest { p...
    99+
    2022-11-13
  • c#中查询表达式GroupBy怎么用
    这篇文章主要介绍c#中查询表达式GroupBy怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实验基础数据用例:Student类:public class Student  ...
    99+
    2023-06-25
  • 如何使用Linq Lambda表达式替换匿名方法
    小编给大家分享一下如何使用Linq Lambda表达式替换匿名方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Linq Lambda表达式Linq Lambda表达式是一种语言功能,在许多方面类似于匿名方法。事实上,如果...
    99+
    2023-06-17
  • Mybatis Plus的lambda表达式查询异常的处理方法
    今天小编给大家分享一下Mybatis Plus的lambda表达式查询异常的处理方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-06-26
  • C++中Lambda表达式的语法与实例
    目录概述 语法分析 捕获列表 关键字声明 mutableexception示例 捕获列表按值传递捕获列表按引用传递总结概述 C++ 11 中的 Lambda 表达式用于定义并创建匿...
    99+
    2022-11-12
  • C++学习之Lambda表达式的用法详解
    目录简介捕获原理Lambda回调简介 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中...
    99+
    2022-11-13
  • C++11的lambda表达式怎么使用
    这篇文章主要讲解了“C++11的lambda表达式怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11的lambda表达式怎么使用”吧!可变lambda假设有如下vector,保...
    99+
    2023-06-19
  • Python中的lambda表达式的用法
    本篇内容主要讲解“Python中的lambda表达式的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的lambda表达式的用法”吧!问:说说Python中的lambda表达式?...
    99+
    2023-06-19
  • C#中如何使用LINQ和Lambda表达式提高代码效率及解决方法
    C#中如何使用LINQ和Lambda表达式提高代码效率及解决方法引言:随着软件开发的不断进步和发展,代码的效率逐渐成为开发者关注的重要方面之一。C#作为一种强大的编程语言,提供了许多工具和功能来提高代码的效率。其中,LINQ和Lambda表...
    99+
    2023-10-22
    Lambda表达式 C#中的LINQ(Language Integrated Query)
  • C# 内部类与Lambda表达式用法详解
    目录一、内部类1.什么是内部类?1.类作为形参和返回值:2.内部类的几种形式二、Lambda表达式(强调做什么,而不是以什么形式去做)1.Lambda表达式的格式要求:2.Lambd...
    99+
    2022-11-12
  • Mybatis Plus 新版lambda 表达式查询异常的处理
    目录新版lambda 表达式查询异常注意点lambda表达式异常应该如何处理我们看一个例子新版lambda 表达式查询异常 在使用新版Mybatis Plus工具时,新增的查询有支持...
    99+
    2022-11-12
  • C++实例详解lambda表达式的使用
    目录lambda表达式1、lambda表达式语法2、lambda应用3、lambda表达式的应用实践1、计算器案例2、智能指针案例3、优先级队列lambda表达式 C++11 函数对...
    99+
    2022-11-13
  • C++11中的lambda表达式怎么使用
    本篇内容介绍了“C++11中的lambda表达式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!可调用对象对于一个表达式e,如果可以编...
    99+
    2023-06-19
  • C++精要分析lambda表达式的使用
    目录引言语法与示例捕获列表捕获引用特殊用法实现原理应用引言 C++要走向现代语言,如果不支持lambda表达式,你很难认为这门语言和现代有什么关系。幸好,从C++11标准起,它就实现...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作