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

  • 查询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实战学习笔记(一) LINQ to (Objects, XML, SQL) 入门初步

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

  2. LinQ实战学习笔记(三) 序列,查询操作符,查询表达式,表达式树

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

  3. Entity Framework学习笔记(四)----Linq查询(1)

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

  4. LinQ实战学习笔记(二) C#增强特性

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

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

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

  6. java之jvm学习笔记四(安全管理器)

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

  7. ES6学习笔记<四> default、rest、Multi-line Strings

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

  8. python3.4学习笔记(四) 3.x和2.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. 初探设计:Java接口和抽象类何时用?怎么用?

    今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”.哪怕只是throw了一个新的Exception.哈哈,这是我犯的错误. 一.接口和抽象类 类,即一个对象. 先抽象类,就是抽象出类的 ...

  2. 关于float /double、string类型的hash函数/hash表实现(转)

    #include <ext/hash_map> #include <math.h> #include <stdio.h> using namespace std; ...

  3. shell 常用命令

    Terminal是Mac OS X系统中的字符控制界面,可以更灵活地控制苹果电脑以下看到 “>“ 就是打指令的地方,prompt,指令列>pwd列出路径>ls列出此档案夹里所有的东西 ...

  4. composer 安装使用

    首先开启 php.ini ssl配置. 然后通过如下地址下载对应安装包安装即可:http://www.phpcomposer.com/ 当然如果安装失败,也可以下载 composer.phar 包 命 ...

  5. mono+jexus 之连接数据库

    System.ArgumentException Unable to find the requested .Net Framework Data Provider. It may not be in ...

  6. python 字符串截取

    我们可以通过索引来提取想要获取的字符,可以把python的字符串也做为字符串的列表就更好理解 python的字串列表有2种取值顺序1是从左到右索引默认0开始的,最大范围是字符串长度少1s = 'ilo ...

  7. 让C程序更高效的10种方法(转)

    原文:http://blog.jobbole.com/1198/ 代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性.有效性.紧凑性和效率(内存).代码设计比实际执行更难 .因此,每一 ...

  8. Qt Error: dependent '..\***' does not exist.

    大概意思:所依赖的资源不存在. 实际上是工程找不到所依赖的资源. 本人的解决方案(可能拙劣,也不一定是正道):将资源拷贝到工程目录下.

  9. SQL server 数据库连接方式分析

    SQL server 数据库连接方式图示: ODBC和OLEDB连接的区别 ODBC(开放数据库互连):是Microsoft引进的一种早期数据库接口技术.它实际上是ADO的前身.早期的数据库连接是非常 ...

  10. WCF安全2-非对称加密

    概述: 数字签名和加密依赖于相应的加密算法 自变量:加密前的数据.密钥 因变量:加密后的数据 加密算法分类:根据加密和解密这两种步骤采用的密钥的是否相同进行分类 相同:对称加密 不相同:非对称加密 非 ...