Linq入门演练---(1)基本用法-分组,排序,内连接
这一节大家共同学习下LINQ的基本用法,主要包括LINQ的分组,排序,和内外连接。
1.分组
基本语法: group element by key
element 表示查询结果返回的元素,key表示分组条件。group子句返回的类型为IGrouping<TKey,TElement>的查询结果。
IGrouping<TKey,TElement>可以看成一个hashtable内部嵌套一个list列表的数据结果. 其中TElement就是一个list
我们看下面的一个事例,下面这个实例演示根据性别对用户进行分组
代码
- publicclass User
- {
- public User(string userName,string sex,int age)
- {
- UserName = userName;
- Sex = sex;
- Age = age;
- }
- publicstring UserName
- {
- get;
- set;
- }
- publicstring Sex
- {
- get;
- set;
- }
- publicint Age
- {
- get;
- set;
- }
- }
public class User
{
public User(string userName,string sex,int age)
{
UserName = userName;
Sex = sex;
Age = age;
} public string UserName
{
get;
set;
} public string Sex
{
get;
set;
} public int Age
{
get;
set;
}
}
- privatevoid button1_Click(object sender, EventArgs e)
- {
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- group var1 by var1.Sex;
- string str = "";
- foreach (var item in query1)
- {
- str += item.Key + "\r\n";
- foreach (var user in item)
- {
- str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
- }
- }
- textBox1.Text = str;
- }
private void button1_Click(object sender, EventArgs e)
{
User[] users = {
new User("刘德华","男",40),
new User("张学友","男",30),
new User("张曼玉","女",35),
new User("杨幂","女",53)
}; var query1 =
from var1 in users
group var1 by var1.Sex; string str = "";
foreach (var item in query1)
{
str += item.Key + "\r\n"; foreach (var user in item)
{
str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
} }
textBox1.Text = str; }
效果图

以上是简单的分组,如果需要对分组结果进行排序,需要把分组结果保存到一个临时变量中
语法: group element by key into temp
以下是按年龄从小到大的排序:
代码
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- group var1 by var1.Age into temp
- orderby temp.Key descending
- select temp;
- string str = "";
- foreach (var item in query1)
- {
- str += item.Key + "\r\n";
- foreach (var user in item)
- {
- str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
- }
- }
- textBox1.Text = str;
User[] users = {
new User("刘德华","男",40),
new User("张学友","男",30),
new User("张曼玉","女",35),
new User("杨幂","女",53)
};
var query1 =
from var1 in users
group var1 by var1.Age into temp
orderby temp.Key descending
select temp;
string str = "";
foreach (var item in query1)
{
str += item.Key + "\r\n";
foreach (var user in item)
{
str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
}
}
textBox1.Text = str;
效果图

2.排序
在linq中排序使用orderby
语法 orderby elment descending||ascending
ascending表示升序,descending表示降序
下面这个DEMO演示按年龄从大到小排序
代码:
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- orderby var1.Age descending
- select var1;
- string str = "";
- foreach (var item in query1)
- {
- str += item.UserName + "--" + item.Age + "\r\n";
- }
- textBox1.Text = str;
User[] users = {
new User("刘德华","男",40),
new User("张学友","男",30),
new User("张曼玉","女",35),
new User("杨幂","女",53)
};
var query1 =
from var1 in users
orderby var1.Age descending
select var1;
string str = "";
foreach (var item in query1)
{
str += item.UserName + "--" + item.Age + "\r\n";
}
textBox1.Text = str;
效果图

3.内连接
内连接查询就是根据一定的条件查询两个数据源中都存在的元素
语法: join elment in datasource on re1 equals re2
以下代码查找两个数组中都存在的元素。
代码:
- privatevoid button3_Click(object sender, EventArgs e)
- {
- //查询两个数组中都存在的元素
- int[] arrOne = { 10,20,30,6,8};
- int[] arrTwo = { 10,4,6,8,90,3};
- var query = from re1 in arrOne
- join re2 in arrTwo on re1 equals re2
- select new { re1 = re1, re2 = re2 };
- foreach (var item in query)
- {
- Console.WriteLine(item);
- }
- }
private void button3_Click(object sender, EventArgs e)
{
//查询两个数组中都存在的元素
int[] arrOne = { 10,20,30,6,8};
int[] arrTwo = { 10,4,6,8,90,3}; var query = from re1 in arrOne
join re2 in arrTwo on re1 equals re2
select new { re1 = re1, re2 = re2 }; foreach (var item in query)
{
Console.WriteLine(item);
} }
查询结果:
- { re1 = 10, re2 = 10 }
- { re1 = 6, re2 = 6 }
- { re1 = 8, re2 = 8 }
{ re1 = 10, re2 = 10 }
{ re1 = 6, re2 = 6 }
{ re1 = 8, re2 = 8 }
4.左连接
左连接和SQL中的左连接类似,返回第一个结果集中的所有元素。
下面的代码演示使用左连接,左连接要用到defaultempty()方法,此方法从列表中获取指定元素,如果列表为空,返回默认值
代码
- privatevoid button4_Click(object sender, EventArgs e)
- {
- //左连接
- int[] arrOne = { 10, 20, 30, 6, 8 };
- int[] arrTwo = { 10, 4, 6, 8, 90, 3 };
- var query = from re1 in arrOne
- join re2 in arrTwo on re1 equals re2 into temgrp
- from grp in temgrp.DefaultIfEmpty()
- select new { re1 = re1, re2 = grp };
- foreach (var item in query)
- {
- Console.WriteLine(item);
- }
- }
private void button4_Click(object sender, EventArgs e)
{
//左连接
int[] arrOne = { 10, 20, 30, 6, 8 };
int[] arrTwo = { 10, 4, 6, 8, 90, 3 }; var query = from re1 in arrOne
join re2 in arrTwo on re1 equals re2 into temgrp
from grp in temgrp.DefaultIfEmpty()
select new { re1 = re1, re2 = grp }; foreach (var item in query)
{
Console.WriteLine(item);
}
}
查询结果
- { re1 = 10, re2 = 10 }
- { re1 = 20, re2 = 0 }
- { re1 = 30, re2 = 0 }
- { re1 = 6, re2 = 6 }
- { re1 = 8, re2 = 8 }
Linq入门演练---(1)基本用法-分组,排序,内连接的更多相关文章
- row_number() over (partition by....order by...)用法 分组排序
row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...
- Linq入门演练---(2)lambda表达式
今天大家一同学习下lambda表达式, lambda表达式使用起来更方便, lambda表达式其实是一个匿名函数,使用的运算符为=> 语法: (参数)=>表达式 如果只有一个参数,可以不使 ...
- oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- ROW_NUMBER() OVER()函数用法;(分组,排序),partition by
转载:https://www.cnblogs.com/alsf/p/6344197.html 1.row_number() over()排序功能: (1) row_number() over()分组排 ...
- ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)
1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- .Net进阶系列(4)-Lambda和linq入门(被替换)
一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...
- LINQ入门教程之各种标准查询操作符(一)
好久之前就想系统的学习下LINQ,好久之前…… 本篇文章主要介绍LINQ等的标准查询操作符,内容取自<LINQ高级编程>,后续还会介绍LINQ to XML ,LINQ to SQL. L ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
随机推荐
- 使用 WPF 创建单实例应用程序
一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口 ...
- Linux 常用命令解析和Bash Shell使用示例脚本演示
摘要 Linux命令是基于文本格式输入输出的一种程序,依照Unix哲学中强调的程序功能简单,输入宽松,输出严谨,各种程序组合能够具有更强大的功能,而具有这样的灵活性的主要原因是Linux规定程序 ...
- Error Code: 1318. Incorrect number of arguments for PROCEDURE company.new_procedure; expected 2, got
1.错误叙述性说明 20:27:34 call new_procedure(20150112) Error Code: 1318. Incorrect number of arguments for ...
- 于win7使用虚拟磁盘隐藏文件
于win7使用虚拟磁盘隐藏文件,我只是win7在验证.其他型号未知. 一.创建虚拟磁盘 1.右键点击"计算机"-----"管理" ------"磁盘管 ...
- QtQuick桌面应用程序开发指南 4)动态管理Note对象_B 5)加强外观 6)许多其他的改进
4.2.2 Stateless(不管状态)JavaScript库 为了让开发轻松点, 使用一个JavaScript接口来和数据库交互是个好主意, 它在QML中提供了方便的方法; 在QtCreator中 ...
- Mysql 5.6 新特性
随笔,真的随笔,以后理解得更深了再修改. Index Condition Pushdown 更多的让存储引擎去处理Where语句中的条款,避免返回无关字段数据等: Multi-Range Re ...
- Cocos2d-Java安装和配置跨平台游戏引擎以及相关的开发工具
假设认为博文图片不清晰.能够Ctrl+鼠标滚动缩放网页比例 Cocos2d-Java是什么? http://blog.csdn.net/touchsnow/article/details/387047 ...
- 视频和音频播放的演示最简单的例子6:OpenGL广播YUV420P(T经exture,采用Shader)
===================================================== 最简单的视频和音频播放的演示样品系列列表: 最简单的视音频播放演示样例1:总述 最简单的视音 ...
- JavaScript之二:this
在JavaScript中,this的指代对象是什么?最精辟的解释却只有一句话: when a function of an object was called, the object will be ...
- 朝花夕拾-4-shell
引言 shell,我们常常会用到,以其强大的功能,会帮助我们解决非常多棘手的问题.近期遇到一个问题,要跑非常多case,假设串行的执行,须要非常久.能不能让他们并行起来,但又不能全部case都并行执行 ...