这一节大家共同学习下LINQ的基本用法,主要包括LINQ的分组,排序,和内外连接。

1.分组

基本语法:  group element by key

element 表示查询结果返回的元素,key表示分组条件。group子句返回的类型为IGrouping<TKey,TElement>的查询结果。

IGrouping<TKey,TElement>可以看成一个hashtable内部嵌套一个list列表的数据结果. 其中TElement就是一个list

我们看下面的一个事例,下面这个实例演示根据性别对用户进行分组

代码

  1. publicclass User
  2. {
  3. public User(string userName,string sex,int age)
  4. {
  5. UserName = userName;
  6. Sex = sex;
  7. Age = age;
  8. }
  9. publicstring UserName
  10. {
  11. get;
  12. set;
  13. }
  14. publicstring Sex
  15. {
  16. get;
  17. set;
  18. }
  19. publicint Age
  20. {
  21. get;
  22. set;
  23. }
  24. }
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;
}
}
  1. privatevoid button1_Click(object sender, EventArgs e)
  2. {
  3. User[] users = {
  4. new User("刘德华","男",40),
  5. new User("张学友","男",30),
  6. new User("张曼玉","女",35),
  7. new User("杨幂","女",53)
  8. };
  9. var query1 =
  10. from var1 in users
  11. group var1 by var1.Sex;
  12. string str = "";
  13. foreach (var item in query1)
  14. {
  15. str += item.Key + "\r\n";
  16. foreach (var user in item)
  17. {
  18. str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
  19. }
  20. }
  21. textBox1.Text = str;
  22. }
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

以下是按年龄从小到大的排序:

代码

  1. User[] users = {
  2. new User("刘德华","男",40),
  3. new User("张学友","男",30),
  4. new User("张曼玉","女",35),
  5. new User("杨幂","女",53)
  6. };
  7. var query1 =
  8. from var1 in users
  9. group var1 by var1.Age into temp
  10. orderby temp.Key descending
  11. select temp;
  12. string str = "";
  13. foreach (var item in query1)
  14. {
  15. str += item.Key + "\r\n";
  16. foreach (var user in item)
  17. {
  18. str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
  19. }
  20. }
  21. 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演示按年龄从大到小排序

代码:

  1. User[] users = {
  2. new User("刘德华","男",40),
  3. new User("张学友","男",30),
  4. new User("张曼玉","女",35),
  5. new User("杨幂","女",53)
  6. };
  7. var query1 =
  8. from var1 in users
  9. orderby var1.Age descending
  10. select var1;
  11. string str = "";
  12. foreach (var item in query1)
  13. {
  14. str += item.UserName + "--" + item.Age + "\r\n";
  15. }
  16. 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

以下代码查找两个数组中都存在的元素。

代码:

  1. privatevoid button3_Click(object sender, EventArgs e)
  2. {
  3. //查询两个数组中都存在的元素
  4. int[] arrOne = { 10,20,30,6,8};
  5. int[] arrTwo = { 10,4,6,8,90,3};
  6. var query = from re1 in arrOne
  7. join re2 in arrTwo on re1 equals re2
  8. select new { re1 = re1, re2 = re2 };
  9. foreach (var item in query)
  10. {
  11. Console.WriteLine(item);
  12. }
  13. }
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);
} }

查询结果:

  1. { re1 = 10, re2 = 10 }
  2. { re1 = 6, re2 = 6 }
  3. { re1 = 8, re2 = 8 }
{ re1 = 10, re2 = 10 }
{ re1 = 6, re2 = 6 }
{ re1 = 8, re2 = 8 }

4.左连接

左连接和SQL中的左连接类似,返回第一个结果集中的所有元素。

下面的代码演示使用左连接,左连接要用到defaultempty()方法,此方法从列表中获取指定元素,如果列表为空,返回默认值

代码

  1. privatevoid button4_Click(object sender, EventArgs e)
  2. {
  3. //左连接
  4. int[] arrOne = { 10, 20, 30, 6, 8 };
  5. int[] arrTwo = { 10, 4, 6, 8, 90, 3 };
  6. var query = from re1 in arrOne
  7. join re2 in arrTwo on re1 equals re2 into temgrp
  8. from grp in temgrp.DefaultIfEmpty()
  9. select new { re1 = re1, re2 = grp };
  10. foreach (var item in query)
  11. {
  12. Console.WriteLine(item);
  13. }
  14. }
  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);
}
}

查询结果

  1. { re1 = 10, re2 = 10 }
  2. { re1 = 20, re2 = 0 }
  3. { re1 = 30, re2 = 0 }
  4. { re1 = 6, re2 = 6 }
  5. { re1 = 8, re2 = 8 }

Linq入门演练---(1)基本用法-分组,排序,内连接的更多相关文章

  1. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  2. Linq入门演练---(2)lambda表达式

    今天大家一同学习下lambda表达式, lambda表达式使用起来更方便, lambda表达式其实是一个匿名函数,使用的运算符为=> 语法: (参数)=>表达式 如果只有一个参数,可以不使 ...

  3. oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  4. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

    转载:https://www.cnblogs.com/alsf/p/6344197.html 1.row_number() over()排序功能: (1) row_number() over()分组排 ...

  5. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  6. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  7. .Net进阶系列(4)-Lambda和linq入门(被替换)

    一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...

  8. LINQ入门教程之各种标准查询操作符(一)

    好久之前就想系统的学习下LINQ,好久之前…… 本篇文章主要介绍LINQ等的标准查询操作符,内容取自<LINQ高级编程>,后续还会介绍LINQ to XML ,LINQ to SQL. L ...

  9. Linq之旅:Linq入门详解(Linq to Objects)【转】

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...

随机推荐

  1. mtk硬件项目开始关闭蓝牙功能:mtk 硬件ScanCode和keycode应用演示示例

    项目要求:该项目因为没有使用android5.0,导致启动bluetooth的蓝牙audio slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制.UI界面是通 ...

  2. Linux中查看socket状态(转)

    Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...

  3. UVA How Big Is It?

    题目例如以下: How Big Is It?  Ian's going to California, and he has to pack his things, including hiscolle ...

  4. 简单的虚拟摇杆控制移动(NGUI)

    一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个BoxCollider,再创建一个sprite child作为虚拟摇杆中间的按钮,叫做button 二.通 ...

  5. POJ 1915 Knight Moves(BFS+STL)

     Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20913   Accepted: 9702 ...

  6. VB高清图标制作方法

    我隆重介绍一个软件:ResHacker !!! 这个软件可以修改软件的很多东西包括图标和标题,下面看**作. 运行ResHacker打开要更改图标的exe文件, 图标组--1--右键0--替换资源-- ...

  7. CentOS7 防火墙 firewall-cmd

    最小化安装 CentOS7 后,很多端口默认是不打开的,需要通过  firewall-cmd   把这些端口打开. 检查防火墙状态 # firewall-cmd --state running 关闭防 ...

  8. 在内存中建立 MySQL 的临时目录(转)

    MySQL 系统会在内存(MEMORY)和磁盘(MyISAM)中建立临时表,如何能知道在磁盘中建立了多少临时表以及在内存中建立多少临时表呢?你可以通过下面命令获知: ? 1 2 3 4 5 6 7 m ...

  9. ZipDemo

    package swing.zip; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt. ...

  10. 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 print-all-combinations-of-given-length

    // 给定一个set字符和一个正数k,找出所有该做set它可以由长度构成k该字符串集合 /* Input: set[] = {'a', 'b'}, k = 3 Output: aaa aab aba ...