上篇C#语法之Linq查询基础一基本把Linq介绍了一下,这篇主要是列举下它的几个常见用法。

在用之前先准备些数据,新建了两个类Student、Score,并通过静态方法提供数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqDemo
{
public class Student
{
public string StuId { get; set; } public string Name { get; set; } public int Age { get; set; } public Student(string stuId, string name,int age)
{
StuId = stuId;
Name = name;
Age = age;
} public static List<Student> GetAllStudents()
{
List<Student> stus = new List<Student>() {
new Student("","xiaoming1",),
new Student("","xiaoming2",),
new Student("","xiaoming3",),
new Student("","xiaoming4",),
new Student("","xiaoming5",),
new Student("","xiaoming1",)
};
return stus;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqDemo
{
public class Score
{
public string StuId { get; set; } public int Math { get; set; } public int English { get; set; } public int Chinese { get; set; } public Score(string stuId, int math, int english, int chinese)
{
StuId = stuId;
Math = math;
English = english;
Chinese = chinese;
} public static List<Score> GetAllScores()
{
List<Score> scores = new List<Score>()
{
new Score("",,,),
new Score("",,,),
new Score("",,,),
new Score("",,,),
new Score("",,,)
};
return scores;
} }
}

一、筛选

where 是筛选lamdba表达式的,OfType<TResult>是筛选TResult类型的

            int[] a = new int[] { , , , , , , , , ,  };
var stus = Student.GetAllStudents().Where(p => p.StuId.Equals(""));
foreach (Student stu in stus)
{
Console.WriteLine("StuId:{0} Name:{1}", stu.StuId, stu.Name);
} var result = a.Where((r, index) => r % == && index % == );
foreach (var s in result)
{
Console.WriteLine("{0}", s);
}
Console.WriteLine("--------------------------");
object[] data = { "one", , , "four", };
//OfType 可隐式转换 sting可隐式转换为int int不可隐式转换为string 所以不能直接写OfType<string>()
result = data.OfType<int>();
foreach (var s in result)
{
Console.WriteLine("{0}", s);
}

二、改变元素顺序

Orderby thenby来进行排序,thenby可以使用多次来多条件排序

            //单个排序
int[] a = new int[] { , , , , , , , , , };
var result = a.OrderByDescending(p => p);
foreach (var s in result)
{
Console.WriteLine("{0}", s);
}

            //多条件排序
var result = Student.GetAllStudents().OrderByDescending(p => p.StuId).ThenBy(p => p.Name); foreach (var s in result)
{
Console.WriteLine("StuId:{0} Name:{1}", s.StuId, s.Name);
}

翻转

对于上面的查询后面加一个Reverse()方法则会将结果翻转。

            var result = Student.GetAllStudents().OrderByDescending(p => p.StuId).ThenBy(p => p.Name).Reverse();

            foreach (var s in result)
{
Console.WriteLine("StuId:{0} Name:{1}", s.StuId, s.Name);
}

三、分组

分组常用作统计或查找重复。下面的例子就是查找姓名和年龄都相同的学生。

            var result = from stu in Student.GetAllStudents()
group stu by new { stu.Name, stu.Age } into g
where g.Count() >
select new
{
g.Key.Name,
g.Key.Age
}; foreach (var s in result)
{
Console.WriteLine("Name:{0} Age:{1}", s.Name, s.Age);
}

四、连接

左连接

            var result = from stu in Student.GetAllStudents()
join s in Score.GetAllScores() on stu.StuId equals s.StuId into joinStuScore
from p in joinStuScore.DefaultIfEmpty()
select new
{
StuId = stu.StuId,
Name = stu.Name,
Math = p == null ? : p.Math,
English = p == null ? : p.English,
Chinese = p == null ? : p.Chinese };
foreach (var s in result)
{
Console.WriteLine("StuId:{0} Name:{1} Math:{2} English:{3} Chinese:{4}", s.StuId, s.Name, s.Math, s.English, s.Chinese);
}

内连接

            var result = from stu in Student.GetAllStudents()
join s in Score.GetAllScores() on stu.StuId equals s.StuId select new
{
StuId = stu.StuId,
Name = stu.Name,
Math = s.Math,
English = s.English,
Chinese = s.Chinese };
foreach (var s in result)
{
Console.WriteLine("StuId:{0} Name:{1} Math:{2} English:{3} Chinese:{4}", s.StuId, s.Name, s.Math, s.English, s.Chinese);
}

五、集合操作

下面是两个集合的交集、差集和并集,至于distinct这个之前有专门讲解。

            int[] a = {,,, };
int[] b = { ,,,};
var result = a.Intersect(b);
foreach (var r in result)
{
Console.WriteLine(r);
}
Console.WriteLine("---------------");
result=a.Except(b);
foreach (var r in result)
{
Console.WriteLine(r);
}
Console.WriteLine("---------------");
result = a.Union(b);
foreach (var r in result)
{
Console.WriteLine(r);
}

六、分区

Take()和Skip()常用来做分页操作。下面的demo演示分页。

            int pageSize = ;
int pageCount = (int)Math.Ceiling(Student.GetAllStudents().Count()/(double)pageSize);
for (int pageIndex = ; pageIndex < pageCount; pageIndex++)
{
Console.WriteLine("page {0}",pageIndex);
var result = (from s in Student.GetAllStudents().OrderBy(p => p.Age) select s).Skip(pageIndex * pageSize).Take(pageSize); foreach (var s in result)
{
Console.WriteLine("StuId:{0} Name:{1} Age:{2}", s.StuId, s.Name,s.Age);
}
}

七、限定符操作符

Any、All、Contains都是限定符操作符。Any是否有一个满足条件。ALL是所有元素都满足条件。Contains检查某个元素是否在集合中。都是返回布尔值。

            bool anyFlag = Student.GetAllStudents().Any(p=>p.Name.Equals("xiaoming1") &&p.Age==);
bool allFlag = Student.GetAllStudents().Any(p =>p.Age == );
Student s = new Student("","xiaoming",);
bool containsFlag = Student.GetAllStudents().Contains(s);
Console.WriteLine("Any:{0} All:{1} Contains:{2}",anyFlag,allFlag,containsFlag);

八、聚合函数

Linq还提供了Count()、Sum()、Min()、Max()、Average()、Aggregate()一系列聚合函数。

C#语法之Linq查询基础二的更多相关文章

  1. C#语法之Linq查询基础一

    Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都 ...

  2. LINQ查询基础

    一.什么是LINQ LINQ是Language Integrate Query的缩写,意为语言集成查询,是微软在.Net Framework 4.5版中推出的主要特性之一. 它为开发人员提供了统一的数 ...

  3. 二:MVC之LINQ查询语法

    LINQ(Language Integrated Query)语言集成查询是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以操作内存数据的方式,查询数 ...

  4. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  5. .NET LINQ查询语法与方法语法

    LINQ 查询语法与方法语法      通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...

  6. LINQ基础(二)

    本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblo ...

  7. linq查询语法和方法-簡單用法

    來自:http://www.cnblogs.com/knowledgesea/p/3897665.html 1.简单的linq语法 //1 var ss = from r in db.Am_recPr ...

  8. C# LINQ学习笔记二:LINQ标准查询操作概述

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5801249.html,记录一下学习过程以备后续查用. “标准查询运算符”是组成语言集成查询 (LINQ) 模式 ...

  9. C#基础:LINQ 查询函数整理

    1.LINQ 函数   1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...

随机推荐

  1. 使用Linq对Hashtable和Dictionary<T,T>查询的效率比较

    近期做版本迭代任务,有一个在店铺头部展示店主所在的城市名称和省份名称的需求,店主信息表中保存了店主所在的城市Id和省份Id,由于原有业务复杂,要尽量减少Sql执行时间,所以不考虑join城市地区详细表 ...

  2. C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB

    C# winform 窗体应用程序之图片上传Oracle数据库保存字段BLOB 我用的数据库是Oracle,就目前来看,许多数据库现在都倾向于Oracle数据库,对ORACLE数据库基本的操作也是必须 ...

  3. 浅析C# Dictionary实现原理

    目录 一.前言 二.理论知识 1.Hash算法 2.Hash桶算法 3.解决冲突算法 三.Dictionary实现 1. Entry结构体 2. 其它关键私有变量 3. Dictionary - Ad ...

  4. C#之asp.net 及MVC 生成动态验证码:

    C#之asp.net 及MVC 生成动态验证码: 1.生成验证码字符串 // 随机生成指定长度的验证码字符串private string RandomCode(int length) { string ...

  5. jzoj5347

    tj:80pts:維護f[i][j]表示當前第i個方塊必須選,且選了j個的最優解,設w[i]為第i個方塊長度 則可以枚舉上次選了第k個方塊,則f[i][j]=max{f[k][j-1]+w[i]*(i ...

  6. 杭电OJ第11页2010-2019道题(C语言)

    2010. 水仙花数 问题描述 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位 ...

  7. XP系统安装VS2010失败的解决方法

    今天装了一个双系统,但是在XP系统上安装VS2010的时候就出现了下面的错误 于是在网上搜索各种资源,查看错误日志,网上说是office2007的原因,我也抱着试试看的态度去卸载了,可是卸载后却发现还 ...

  8. Ubuntu Cannot run program "../SDK/build-tools/xxx/aapt": erro = 2 No such file or directory

    64位ubuntu Android Studio  Gradle编译时出现如下报错: java.io.IOException: Cannot run program "/home/king/ ...

  9. jQuery 阻止冒泡和默认事件

    jQuery event.preventDefault() 方法 event.preventDefault() 方法阻止元素发生默认的行为. 例如: 当点击提交按钮时阻止对表单的提交 阻止以下 URL ...

  10. 剑指offer四十三之左旋转字符串

    一.题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...