LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符
这一篇介绍了下面的内容:
- 查询object数组
- 查询强类型数组
- 查询泛型字典
- 查询字符串
- SelectMany
- 索引
- Distinct操作符
- 排序
- 嵌套查询
- 分组
- 组连接
- 内连接
- 左外连接
- 交叉连接
- skip,take
详细请参看代码.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } private void button1_Click(object sender, EventArgs e)
{
//查询object数组
Object[] array = { "String", , true, 'a' };
var types = array
.Select(s => s.GetType().Name)
.OrderBy(s => s);
ObjectDumper.Write(types);
} private void button2_Click(object sender, EventArgs e)
{
//查询强类型数组
Book[] books ={
new Book{Title="Linq in Action"},
new Book{Title="Linq for Fun"},
new Book{Title="Extreme LINQ"}
}; var titles =
books
.Where(s => s.Title.Contains("Action"))
.Select(s => s.Title); ObjectDumper.Write(titles);
} private void button3_Click(object sender, EventArgs e)
{
//查询泛型字典
var dic = new Dictionary<int, string>();
dic.Add(, "zero");
dic.Add(, "un");
dic.Add(, "deux");
dic.Add(, "trois");
dic.Add(, "quatre");
var list =
dic
.Where(s => s.Key % == )
.Select(s => s.Value); ObjectDumper.Write(list);
} private void button4_Click(object sender, EventArgs e)
{
//查询字符串, 字符串实现了IEnumerable<Char>接口
var count = "Non-letter characters in this string: 6"
.Where(s => !Char.IsLetter(s))
.Count(); ObjectDumper.Write(count);
} private void button5_Click(object sender, EventArgs e)
{
string[] books ={"Funny Stories","All your base are belong to us",
"LINQ rules","C# on Rails","Bonjour mon Amour"};
var query =
books
.Where(s => s.Length > )
.Select(s => new { Book = s.ToUpper() }); var query1 =
from s in books
where s.Length >
orderby s
select new { Book = s.ToUpper() }; dataGridView1.DataSource = query1.ToList();
} private void button6_Click(object sender, EventArgs e)
{
var query =
from s in SampleData.Books
where s.Title.Length >
orderby s.Title
select new { Book = s.Title, Price = s.Price }; dataGridView2.DataSource = query.ToList();
} private void button7_Click(object sender, EventArgs e)
{
//SelectMany var query1 =
SampleData.Books
.SelectMany(s => s.Authors);
ObjectDumper.Write(query1); var query =
from book in SampleData.Books
from author in book.Authors
select author.FirstName + author.LastName; ObjectDumper.Write(query);
} private void button8_Click(object sender, EventArgs e)
{
var book =
SampleData.Books
.Select((s, no) => new { no, s.Title })
.OrderBy(s => s.Title); //无法翻译为等同的查询表达式语法 ObjectDumper.Write(book); } private void button9_Click(object sender, EventArgs e)
{
//Distinct操作符
var query =
SampleData.Books
.SelectMany(s => s.Authors)
.Select(s => s.FirstName + s.LastName);
ObjectDumper.Write(query); //去除重复的author,C#没有和distinct等同的查询表达式
var query1 =
SampleData.Books
.SelectMany(s => s.Authors)
.Distinct()
.Select(s => s.FirstName + s.LastName);
Console.WriteLine();
ObjectDumper.Write(query1); } private void button10_Click(object sender, EventArgs e)
{
//排序
var query =
from s in SampleData.Books
orderby s.Publisher.Name, s.Price descending, s.Title
select new
{
Publisher=s.Publisher.Name,
s.Price,
s.Title
};
dataGridView1.DataSource = query.ToList();
ObjectDumper.Write(query); var query1 =
SampleData.Books
.OrderBy(s => s.Publisher.Name)
.ThenByDescending(s => s.Price)
.ThenBy(s => s.Title)
.Select(s => new
{
publisher = s.Publisher.Name,
s.Price,
s.Title
});
Console.WriteLine();
ObjectDumper.Write(query1); } private void button11_Click(object sender, EventArgs e)
{
//嵌套查询 var query =
from s in SampleData.Publishers
select new
{
item1 = s.Name,
item2 =
from book in SampleData.Books
where book.Publisher.Name == s.Name
select book
}; foreach (var m in query)
{
Console.WriteLine(m.item1+":");
foreach (var k in m.item2)
{
Console.WriteLine(k.Title);
}
Console.WriteLine();
} } private void button12_Click(object sender, EventArgs e)
{
//分组
//代码让图书按出版社分组.属于同一出版社的图书将被分到相同的组中.
//在这个查询中,该分组publisherBooks对象是IGrouping<TKey,T>接口.
//其中T为集合IEnumerable<Book> var query =
from s in SampleData.Books
group s by s.Publisher into publisherBooks
select new
{
publisher=publisherBooks.Key.Name,
books=publisherBooks,
booksum=publisherBooks.Count()
};
foreach (var m in query)
{
Console.WriteLine(m.publisher + ":");
foreach (var k in m.books)
{
Console.WriteLine(k.Title);
}
Console.WriteLine(m.booksum);
Console.WriteLine();
} } private void button13_Click(object sender, EventArgs e)
{
//组连接
var query =
from s in SampleData.Publishers
join book in SampleData.Books
on s equals book.Publisher into publisherBooks
select new
{
publisher=s.Name,
books=publisherBooks
}; foreach (var m in query)
{
Console.WriteLine(m.publisher + ":");
foreach (var k in m.books)
{
Console.WriteLine(k.Title);
}
Console.WriteLine();
} } private void button14_Click(object sender, EventArgs e)
{
//内连接,旨在找到两个序列的交集
//和组连接的差别是,没有使用into关键字将元素分组,而是将图书投影在了出版社对象上
//注意没有任何书籍的出版社没有显示出来,这是因为在两个待连接序列中均符合条件的组合才会出现在结果序列中.
var query =
from s in SampleData.Publishers
join book in SampleData.Books on s equals book.Publisher
select new
{
publisher=s.Name,
books=book.Title
}; var query2=
SampleData.Publishers
.Join(SampleData.Books, //内部序列
s=>s, //外部的key选择器
book=>book.Publisher, //内部的key选择器
(s,book)=>new //结果选择器
{
publisher=s.Name,
books=book.Title
}); ObjectDumper.Write(query2); foreach (var m in query)
{
Console.WriteLine(m.publisher + ":");
Console.WriteLine(m.books);
Console.WriteLine();
} } private void button15_Click(object sender, EventArgs e)
{
//左外连接
var query =
from s in SampleData.Publishers
join book in SampleData.Books
on s equals book.Publisher into publisherBooks
from book in publisherBooks.DefaultIfEmpty() //为空序列提供默认元素
select new
{
publisher=s.Name,
books=book==default(Book)?"(no books)":book.Title
}; ObjectDumper.Write(query);
} private void button16_Click(object sender, EventArgs e)
{
//交叉连接, 计算出两个序列中所有元素的积
//结果序列由一个序列的每个元素和另一个序列中每个元素的完全组合构成
var query =
from s in SampleData.Publishers
from book in SampleData.Books
select new
{
correct=(s==book.Publisher),
publisher=s.Name,
books=book.Title
};
ObjectDumper.Write(query);
} private void button17_Click(object sender, EventArgs e)
{
//skip,take
var list1 = new List<string>();
for (int i = ; i < ; i++)
list1.Add(i.ToString()); var query =
list1
.Select(s=>s)
.Skip().Take(); ObjectDumper.Write(query);
} } }
原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/
LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符的更多相关文章
- LinQ实战学习笔记(一) LINQ to (Objects, XML, SQL) 入门初步
LINQ对于笔者来说, 优美而浓缩的代码让人震惊. 研究LINQ就是在艺术化自己的代码. 之前只是走马观花学会了基本的语法, 但是经常在CSDN看到令人惊讶自叹不如的LINQ代码, 还是让人羡慕嫉妒恨 ...
- LinQ实战学习笔记(三) 序列,查询操作符,查询表达式,表达式树
序列 延迟查询执行 查询操作符 查询表达式 表达式树 (一) 序列 先上一段代码, 这段代码使用扩展方法实现下面的要求: 取进程列表,进行过滤(取大于10M的进程) 列表进行排序(按内存占用) 只保留 ...
- Entity Framework学习笔记(四)----Linq查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...
- LinQ实战学习笔记(二) C#增强特性
C# 为支持LINQ添加了许多语言特性: 隐式类型局部变量 对象初始化器 Lambda表达式 扩展方法 匿名类型 了解这些新特性是全面了解LINQ的重要先解条件,因此请不要忽视它们. (一) 隐式类 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- python3.4学习笔记(四) 3.x和2.x的区别,持续更新
python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...
- ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁
作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...
随机推荐
- IPFS搭建分布式文件系统 - 访问控制
IPFS 一个内容可寻址.对等的超媒体分发协议. IPFS网络中的节点形成分布式文件系统. 为什么要用IPFS? “IPFS and the Blockchain are a perfect matc ...
- MFC中混合使用Duilib制作界面
因为公司项目最近入了MFC的这个大坑,用MFC做UI做了一段时间,感觉不是很方便,开发效率有点慢. 看了c++里面做界面的类库,感觉Duilib比较符合做界面的需求,而且很多大公司也在使用Duilib ...
- dos下mysql登陆
dos下先进入mysql的bin目录 然后执行:mysql -r root -p123456(注意123456是密码) 进去之后:首先要这样:use test;//代表你目前要使用的是test这个数据 ...
- SGU 422 Fast Typing(概率DP)
题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...
- Python 闭包
什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...
- CentOS6部署VNC服务端
VNC (Virtual Network Computer)是虚拟网络计算机的缩写.VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Wi ...
- iOS-布局-Masonry
一.说明:demo中的举例视图介绍 UIView *_blackView; 作为父视图 UIView *_redView; 与父视图内边距为10 ...
- [linux]记录如何设置一个新的vps
背景 我正在做一个小项目,做好了打算上线,所有需要买个服务器,看了一圈,发现还是卖个vps合算.买了之后,进行了一些列的设置,这里记录一下,以便后面查看. 系统: ubuntu 内存:1G 一.更改时 ...
- vuejs入门小demo-搜索大全
这个demo非常适合入门的同学,不再是简单的todolist.用到的知识点有组件通信,过渡效果,vue-rsource,还有一些基本的vue指令. 先放一张截图: 是不是感觉高端大气上档次呢,演示地址 ...
- CentOS6.5菜鸟之旅:U盘安装CentOS64位
一.前言 之前下载了个CentOS7 32位版,一下就安装成功了,但由于其目录结构等与之前的CentOS版本有很大的不同,加上教程不多不利于我这种菜鸟学习,于是决定重装CentOS6.5来学习.本篇用 ...