定义
IEnumerable<T> 上的每个方法都是一个标准查询运算符(Standard Query Operator)。 它提供了对集合进行查询的能力。
注意查询运算符和查询表达式是有区别的。
这里有一个简单的例子
A simple sample show how to use.using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqSample01
{
class Program
{
public class Student
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public List<int> Scores;
}
// Create a data source by using a collection initializer.
static List<Student> students = new List<Student>
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94, 65, 91}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89, 85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72, 91, 70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86, 90, 94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92, 80, 87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90, 83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79, 88, 92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82, 81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96, 85, 91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92, 91, 91} }
};
static void Main(string[] args)
{
IEnumerable<Student> studentQuery = students.Where(
student => student.Scores[0] > 90
);
foreach (Student item in studentQuery)
{
Console.WriteLine("Name: {0} : {1}", item.Last, item.Scores[0]);
}
Console.ReadKey();
}
}
}
关于 Linq 查询运算符的知识点。
- 关于 IEnumerable<T>
.NET 中集合本质是一个类,这个类的关键是实现了 IEnumerable<T> 的接口。要实现对集合的遍历关键就是要实现 IEnumerable<T> 中规定的方法。
IEnumerator 和 IEnumerable<T>的迭代器遍历。
这个与C++ STL的迭代器想法差不多,对于一个集合来说如果我们知道它具体元素的个数,我们可以使用
for (int i = 0; i < array.length; i++) 的(length-index)方式来实现遍历,但对于不知道具体元素的集合来说,
比较合适的方式是从第一个到最后一个,逐个的进行遍历。IEnumerator实现的目标就是允许使用迭代器方式来遍历。
- 集合初始化器
// Create a data source by using a collection initializer.static List<Student> students = new List<Student>
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire", Last="O’Donnell", ID=112, Scores= new List<int> {75, 84, 91, 39}},
... ...
};
这段代码用了初始化数组的方式初始化了一个集合 List<Student>,但按照正常来说集合一定是在实例化好以后才能添加成员的。
其实这里使用了 C# 3.0一个新增的特性 集合初始化器。
集合初始化器要想编译成功,最理想的情况是集合支持 System.Collections.Generic.ICollection<T> 接口,这样可以保证
集合支持 Add() 方法。
并不是所有的集合都支持集合初始化器,原因有两个:
1) 并不是所有的集合都实现了ICollection<T> 接口,换个角度看就是这个接口并不是对每个集合都有用。
2) 由于方法名的匹配,例如 一个集合初始化器 支持 new DataStore(){a, {b,c}},这就表示 add()方法
要支持两种接口 add(a) 和 add(b, c),接口多样化会给程序带来方便,但有时也是负担。
- Linq 函数
where() 筛选IEnumerable<Student> studentQuery