16 C# 第十四章 标准查询运算符

定义

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值