LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符

时间:2022-09-06 08:34:00

这一篇介绍了下面的内容:

  • 查询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, 常用查询操作符的更多相关文章

  1. LinQ实战学习笔记&lpar;一&rpar; LINQ to &lpar;Objects&comma; XML&comma; SQL&rpar; 入门初步

    LINQ对于笔者来说, 优美而浓缩的代码让人震惊. 研究LINQ就是在艺术化自己的代码. 之前只是走马观花学会了基本的语法, 但是经常在CSDN看到令人惊讶自叹不如的LINQ代码, 还是让人羡慕嫉妒恨 ...

  2. LinQ实战学习笔记&lpar;三&rpar; 序列&comma;查询操作符&comma;查询表达式&comma;表达式树

    序列 延迟查询执行 查询操作符 查询表达式 表达式树 (一) 序列 先上一段代码, 这段代码使用扩展方法实现下面的要求: 取进程列表,进行过滤(取大于10M的进程) 列表进行排序(按内存占用) 只保留 ...

  3. Entity Framework学习笔记&lpar;四&rpar;----Linq查询&lpar;1&rpar;

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...

  4. LinQ实战学习笔记&lpar;二&rpar; C&num;增强特性

    C# 为支持LINQ添加了许多语言特性: 隐式类型局部变量 对象初始化器 Lambda表达式 扩展方法 匿名类型 了解这些新特性是全面了解LINQ的重要先解条件,因此请不要忽视它们. (一)  隐式类 ...

  5. C&num;可扩展编程之MEF学习笔记&lpar;四&rpar;:见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. java之jvm学习笔记四&lpar;安全管理器&rpar;

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  7. ES6学习笔记&lt&semi;四&gt&semi; default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  8. python3&period;4学习笔记&lpar;四&rpar; 3&period;x和2&period;x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  9. ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁

    作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...

随机推荐

  1. jquery note--czx

    -------------------------------------------------------+++------------------------------------------ ...

  2. PHP的学习--PHP的闭包

    php的闭包(Closure)也就是匿名函数,是PHP5.3引入的. 闭包的语法很简单,需要注意的关键字就只有use,use是连接闭包和外界变量. $a = function() use($b) {} ...

  3. access数据库用sql语句添加字段,修改字段,删除字段

    用 Create Table 建立一个表 Table1 ,主键是自动编号字段,另一个字段是长度是 10 的文本字段. 代码如下:CREATE TABLE Table1 (Id COUNTER CONS ...

  4. 二模 (4) day1

    第一题: 题目描述: 有一个无穷序列如下:110100100010000100000…请你找出这个无穷序列中指定位置上的数字 解题过程: 1.考虑到1的数目比0少的多,就从1的位置的规律开始分析.前几 ...

  5. silverlight webclient实现上传、下载、删除、读取文件

    1.上传 private void Button_Click_1(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = ...

  6. 数据结构练习 00-自测5&period; Shuffling Machine &lpar;20&rpar;

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...

  7. 基于ASIO的协程与网络编程

    协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行. 协程 ...

  8. activeMQ的简单介绍

    1.什么叫activeMQ? ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 ...

  9. yii2 源码分析Behavior类分析 (四)

    Behavior类是所有事件类的基类,它继承自object类 Behavior类的前面注释描述大概意思: * Behavior类是所有事件类的基类 * * 一个行为可以用来增强现有组件的功能,而不需要 ...

  10. vs使用gitflow

    1.背景:之前在开发一个项目时,用tfs管理代码,并用“禁止多人编辑”来避免冲突,但仅适用于开发团队较小时.缺点: (1).开发团队较大,开发人员较多时,会出现经常互相锁,增加沟通成本.比如增加文件时 ...