本篇博客对应视频讲解

回顾

上一期我们讲解了字符编码相关的内容,大家应该去理解字符和字节之间的关系。并学习使用Encoding类进行编码之间的转换。

今天给大家讲的内容十分的重要,也是C#等语言比其他语言更具优势的地方。它将极大的提高我们处理数据的效率,提升我们的开发体验。

何为LINQ

LINQ(Language Integrated Query)语言集成查询,允许以查询数据库相同的方式操作内存数据。
简单的说,我们有很多数据来源,数据库、文件(xml、json),内存中的数据等等。我们需要针对不同的数据类型使用不同的方法进行操作。

例如,我们处理字符串,就需要使用String类,处理列表需要使用List类中提供的方法,查询数据库更是需要特定的sql查询语言支持,非常的繁琐。而Linq就是更高层次的抽象,可应用于所有数据源的具有多种用途的语法查询特性。

这意味着,我们只需要学习一种查询方法,就可以处理各种数据了。
Linq相当的便捷和实用,正因如此,当Linq出现之后,其他语言也有相关的实现。

使用LINQ

首先给大家官方文档的地址,里面非常详细的介绍和说明了怎么使用Linq进行数据的查询和处理。
完整文档参考
建议大家有时间就对这个文档的内容进行总体浏览,了解都包含哪些内容。之后遇到需求的时候可以有针对性的去查找 。

今天我会给出一些示例,让大家领略一下Linq的威力。

示例代码:

  1. 简单数组Linq操作
	 var numbers = new int[] { 1, 31, 22, 4, 229, 84, 8, 23 };
Console.WriteLine("原数组:");
WriteArray(numbers); // 取最大值
int max = numbers.Max();
Console.WriteLine("最大值为:" + max); // 取第三大的值
int thirdMax = numbers.OrderByDescending(m => m)
.Skip(2)
.First();
Console.WriteLine("第三大的数是" + thirdMax); // 取总和
int sum = numbers.Sum();
Console.WriteLine("总和为:" + sum); // 条件筛选,取所有奇数,并按从小到大排列
var result = numbers.Where(n => n % 2 == 1)
.OrderBy(m => m)
.ToArray(); Console.WriteLine("处理后的结果为:");
WriteArray(result);

数组输出方法

	static void WriteArray(IEnumerable obj)
{
foreach (var item in obj)
{
Console.Write(item.ToString() + " ");
}
Console.WriteLine();
}
  1. 学生考试成绩查询
    我们先创建学生和成绩类:
    Student类:Name,Class,Score
    Score类:English,Chinese,Math
	/// <summary>
/// 成绩类
/// </summary>
public class Score
{
/// <summary>
/// 数学
/// </summary>
public int Math { get; set; }
/// <summary>
/// 英语
/// </summary>
public int English { get; set; }
/// <summary>
/// 语文
/// </summary>
public int Chinese { get; set; } } /// <summary>
/// 学生类
/// </summary>
class Student
{
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 班级
/// </summary>
public string Class { get; set; } /// <summary>
/// 成绩
/// </summary>
public Score Score { get; set; }
}

使用Linq代码示例:
先模拟我们需要数据

		/// <summary>
/// 初始化数据
/// </summary>
/// <returns></returns>
static List<Student> InitData()
{
string[] names = { "张三", "王五", "李四", "赵二", "丁一", "李明", "韩梅", "梦琪", "忆柳", "之桃", "慕青", "问兰", "尔岚", "元香", "初夏" };
var random = new Random(); var students = new List<Student>();
// 创建学生对象
foreach (var name in names)
{
var student = new Student
{
Name = name,
Class = random.Next(1, 4) + "班"
};
students.Add(student);
}
// 模拟学生考试成绩
foreach (var student in students)
{
var score = new Score
{
Chinese = random.Next(60, 101),
English = random.Next(60, 101),
Math = random.Next(60, 101)
};
student.Score = score; Console.WriteLine($"{student.Class}[{student.Name}]的成绩为:" +
$"数学:{score.Math};语文:{score.Chinese};英语:{score.English}" +
$"总分为:{score.Math + score.Chinese + score.English}");
} return students;
}

查询数据

            // 初始化数据
var students = InitData(); // 找出总分最高的学生
var student = students.Select(s =>
{
return new
{
Sum = s.Score.Chinese + s.Score.English + s.Score.Math,
s.Name
};
}).OrderByDescending(s => s.Sum)
.First();
Console.WriteLine("总分最高的学生是:" + student.Name + ";总分为:" + student.Sum); // 找出平均分最高的班级
var topClass = students.GroupBy(s => s.Class)
.Select(s =>
{
return new
{
Average = s.Sum(m => m.Score.Chinese + m.Score.English + m.Score.Math) / s.Count(),
Class = s.Key
};
})
.OrderByDescending(m => m.Average); Console.WriteLine("最高班级:" + topClass.First().Class + ";平均分:" + topClass.First().Average); // 筛选出有分数小于80分的学生,按班分组
var hardStudents = students.Where(m => needImprove(m.Score))
.GroupBy(m => m.Class)
.ToList(); // 输出每班内小于80分的同学
foreach (var group in hardStudents)
{
Console.WriteLine(group.Key + "有低于80分学生" + group.Count() + "名:");
foreach (var item in group)
{
Console.Write(item.Name + " ");
}
Console.WriteLine();
}
// 内部方法,判断是否有小于80分的学科
bool needImprove(Score score)
{
if (score.English < 80 || score.Chinese < 80 || score.Math < 80)
return true;
return false;
}

7-Linq查询语言的更多相关文章

  1. 29.LINQ初探

    本页内容: 1.LINQ查询语言的组成部分: 2.使用LINQ方法语法: 3.排序查询结果 orderby 字句: 4.聚合运算符: 5.查询复杂对象: 6.投影:在查询中创建新对象: 7.Disti ...

  2. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  3. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  4. 2016 .net 招聘

    职位月薪:面议 工作地点:成都 发布日期:2016-02-23 工作性质:全职 工作经验:1-3年 最低学历:大专 招聘人数:5人 职位类别:软件工程师 岗位职责:   1. 负责项目或产品的开发.单 ...

  5. 编程语言的发展趋势by Anders Hejlsberg

    这是Anders Hejlsberg在比利时TechDays 2010所做的开场演讲. 编程语言的发展非常缓慢,期间也当然出现了一些东西,例如面向对象等等,你可能会想,那么我么这么多年的努力都到哪里去 ...

  6. 4-C#格式处理

    本篇博客对应视频讲解 前言 前几篇文章及对应视频是带大家快速体验了一下C#,了解编程语言最基础的内容及面向对象的概念. 接下来我会进一步演示和说明C#还能做些什么. 实际上,C#就一门语言来讲,除去面 ...

  7. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  8. LinQ to SQL用法详解

    LinQ是指集成化查询语言,通过映射将数据库内的表名变为C#的类名,将列名作为属性名,将表的关系作为类的成员对象.O--M--R O-Object对象(李昌辉)R-Relation关系M-Mappin ...

  9. linQ学习笔记之一

    linq解决的问题 1.编程语言中的数据类型与数据库中的数据类型形成的两套体系 2.SQL编码体验落后 3.SQL和XML都有各自的查询语言,而对象没有自己的查询语言 linq简单的集合查询和fore ...

  10. LINQ 的使用

    [转]链接:cnblogs.com/liqingwen/p/5832322.html LINQ 简介 语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framewo ...

随机推荐

  1. Oracle NVL与NVL2函数

    nvl( ) 函数 从两个表达式返回一个非 null 值. 语法 NVL(eExpression1, eExpression2) 参数 eExpression1, eExpression2 如果 eE ...

  2. 765. Couples Holding Hands

    ▶ n 对夫妻共 2n 个人随机坐成一排,“交换其中某两人的位置” 称为一次操作,求最少的操作此次数,使 n 对夫妻两人都相邻.初始座位为非负整数列 D1n-1,其中值为 2k 和 2k+1 的两个元 ...

  3. RAD C++Builder xe7 std::map xtree BUG

    c++Builder 6 下的std::map还能用,有代码提示. 换到xe7,代码提示出来就一个tt.operator [](),代码没法往下写了. 最后把Target Platforms切换到64 ...

  4. Mysql 索引概论

    Mysql性能下降原因 JOIN连接过多 ,索引失效(单值,复合), 查询SQL过水, explian 语法分析SQL性能 https://blog.csdn.net/b1303110335/arti ...

  5. clientX,offsetX,screenX,pageX 区别!

    先总结下区别: event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 eve ...

  6. ubuntu安装rtx

    终端安装RTX sudo apt-get install wine 安装wine下的window扩展包安装工具winetricks,在终端下输入: sudo wget http://winetrick ...

  7. Apache Hive 安装文档

    简介: Apache hive 是基于 Hadoop 的一个开源的数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供简单的sql查询功能,将 SQL 语句转换为 MapReduce 任务 ...

  8. redis的连接方法|连接池|操作

    1.先看下redis的连接 import redis # 连接服务端 r = redis.Redis(host="127.0.0.1",port=6379) #获取所有的key值 ...

  9. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  10. DataStage 一、安装

    安装的详细信息记录于文档中,文档下载地址:http://pan.baidu.com/s/1pJCF9uN 密码: y2ry ;文档内容目录如下: DataStage 一.介绍和安装.......... ...