The Sixth Assignment

今天我们来学习一下LINQ这个神奇的东西。。。还有LINQ相关的一些玩意。。

根据度娘的说法:

LINQ,语言集成查询(Language Integrated Query)是一组用于c#Visual Basic语言的扩展。

它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。

LINQ定义了大约40个查询操作符,如select、from、in、where以及order by

LINQ 提供了一条更常规的途径即给.Net Framework添加一些可以应用于所有信息源的具有多种用途的语法查询特性

这是比向开发语言和运行时添加一些关系数据特性或者类似 XML 特性更好的方式。

这些语法特性就叫做 .NET Language Integrated Query (LINQ)

首先来学习一下LINQ相关的东西

1) from 临时变量 in 实现IEnumerable<T>接口的对象

IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代。

IEnumerable和IEnumerable<T>接口是.NET Framework中最基本的集合访问器。

来看一段代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace IEnumeratorSample
{
    class Person                                    //定义一个Person类
    {
        public string Name;                         //定义Person的名字
        public string Age;                          //定义Person的年龄
        public Person(string name, string age)      //为Person初始化(构造函数)
        {
            Name = name;                            //配置Name值
            Age = age;                              //配置Age值
        }
    }}

上述代码定义了一个Person类并抽象一个Person类的属性,这些属性包括Name和Age。Name和Age属性分别用于描述Person的名字和年龄,用于数据初始化。

初始化之后的数据就需要创建一系列Person对象,通过这些对象的相应属性能够进行对象的访问和遍历,示例代码如下所示。

  class Program  {
        static void Main(string[] args)
        {
            Person[] per = new Person[2]                                          //创建并初始化2个Person对象
            {
                new Person("guojing","21"),                                       //通过构造函数构造对象
                new Person("muqing","21"),                                        //通过构造函数构造对象
            };
            foreach (Person p in per)                                             //遍历对象
                Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);
            Console.ReadKey();
        }  }

上述代码创建并初始化了2个Person对象,并通过foreach语法进行对象的遍历。

但是上述代码是在数组中进行查询的,就是说如果要创建多个对象,则必须创建一个对象的数组,如上述代码中的Per变量,而如果需要直接对对象的集合进行查询,却不能够实现查询功能。

例如增加一个构造函数,该构造函数用户构造一组Person对象,示例代码如下所示。

     private Person[] per;
        public Person(Person[] array)                          //重载构造函数,迭代对象
        {
            per = new Person[array.Length];                    //创建对象
            for (int i = 0; i < array.Length; i++)             //遍历初始化对象
            {
                per[i] = array[i];                             //数组赋值
            }
        }

上述构造函数动态的构造了一组People类的对象,那么应该也能够使用foreach语句进行遍历,示例代码如下所示。

       Person personlist = new Person(per);                              //创建对象
           foreach (Person p in personlist)                                  //遍历对象
           {
                Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);
           }

在上述代码的foreach语句中,直接在Person类的集合中进行查询,系统则会报错“ConsoleApplication1.Person”不包含“GetEnumerator”的公共定义,

因此foreach语句不能作用于“ConsoleApplication1.Person”类型的变量,因为Person类并不支持foreach语句进行遍历。

为了让相应的类能够支持foreach语句执行遍历操作,则需要实现派生自类IEnumerable并实现IEnumerable接口,示例代码如下所示。

  public IEnumerator GetEnumerator()                                                                //实现接口
    {
        return new GetEnum(_people);
    }

为了让自定义类型能够支持foreach语句,则必须对Person类的构造函数进行编写并实现接口,示例代码如下所示。

   class Person:IEnumerable                          //派生自IEnumerable,同样定义一个Personl类
    {
        public string Name;
        public string Age;
        public Person(string name, string age)
        {
            Name = name;
            Age = age;
        }
        public IEnumerator GetEnumerator()
        {
            return new PersonEnum(per);
        }
}

上述代码重构了Person类并实现了接口,接口实现的  class PersonEnum : IEnumerator

    {
    public Person[] _per;
    int position = -1;
    public PersonEnum(Person[] list)
    {
        _per = list;
    }
    public bool MoveNext()                               //实现向前移动
    {
        position++;                                      //位置增加
        return (position < _per.Length);                 //返回布尔值
    }
    public void Reset()                                  //位置重置
    {
        position = -1;                                   //重置指针为-1   }
     public object Current
    {
        get
        {
          return _per[position];                    
       }   }

上述代码实现了foreach语句的功能,当开发Person类初始化后就可以直接使用Personal类对象的集合进行LINQ查询,示例代码如下所示。

     static void Main(string[] args)
        {
            Person[] per = new Person[2]
            {
                new Person("guojing","21"),
                new Person("muqing","21"),                          

            };
            Person personlist = new Person(per);
            foreach (Person p in personlist)
                Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);
            Console.ReadKey();
        }

实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace IEnumeratorSample
{
    class Person : IEnumerable
    {
        public string Name;
        public string Age;
        public Person(string name, string age)
        {
            Name = name;
            Age = age;
        }
        private Person[] per;
        public Person(Person[] array)
        {
            per = new Person[array.Length];
            for (int i = 0; i < array.Length; i++)
            {
                per[i] = array[i];
            }
        }
        public IEnumerator GetEnumerator()
        {
            return new PersonEnum(per);
        }
    }
    class PersonEnum : IEnumerator
    {
        public Person[] _per;
        int position = -1;
        public PersonEnum(Person[] list)
        {
            _per = list;
        }
        public bool MoveNext()
        {
            position++;
            return (position < _per.Length);
        }

        public void Reset()
        {
            position = -1;
        }
        public object Current
        {
            get
            {return _per[position];
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person[] per = new Person[2]
            {
                new Person("guojing","21"),
                new Person("muqing","21"),
            };
            Person personlist = new Person(per);
            foreach (Person p in personlist)//遍历对象
            {
                Console.WriteLine("Name is " + p.Name + " and Age is " + p.Age);
            }
            Console.ReadKey();
        }
    }
}

2) 实现IEnumerable<T>接口的对象.LINQ方法名(lambda表达式)。

吃饭去。。。。。

时间: 2024-10-19 11:42:48

The Sixth Assignment的相关文章

Algorithm Part I:Programming Assignment(2)

问题描述: Programming Assignment 2: Randomized Queues and Deques Write a generic data type for a deque and a randomized queue. The goal of this assignment is to implement elementary data structures using arrays and linked lists, and to introduce you to g

RailsCast26 Hackers Love Mass Assignment rails中按params创建、更新model时存在的安全隐患

Mass assignment是rails中常用的将表单数据存储起来的一种方式.不幸的是,它的简洁性成了黑客攻击的目标.下面将解释为什么及如何解决. 上述表单为一个简单的注册表单.当用户填入name,点击提交时,一个新用户被创建.用户模型被如下定义: ruby create_table :users do |t| t.string :name t.boolean :admin, :default => false, :null => false end 当用户点击提交时,如下的action被执

THE SIXTH DAY

今天是我学习编程的第六天~~ 今天我们又学了许多新的知识,我觉得我今天最大的进步是对循环和多重循环有了更深的理解,明显比前两天有感觉了,但仍有欠缺,仍需努力.今天还学习了数组,我觉得这一部分知识并不是太难,可能是因为这一部分本来就简单的原因,既然它简单,那么我一定要把它学的透彻.今天还学习了函数,我对函数不是太会,今后我要对函数进一步学习,把函数搞精通. 今天我也第一次尝试了焦作一中的餐厅伙食,感觉和我理想的一样,先不说饭的味道和种类,我喜欢这样的餐厅.我对一中的好感度也很高. 今天比较愉快.

hdu4781 Assignment For Princess(构造)

题目链接:hdu4781 Assignment For Princess 题意:n个点m条边,每条有向边的权值分别是1,2,3…m,一个点能到达任意一个点,没有重边和自环,没有任何两条边的权值相同,任意一个有向环的权值和必须是3的倍数,现在需要把这个图输出来. 题解:注意到题目给出的范围m >= n+3,所以一定是可以构造出一个1~n的回路使得权值和为3的倍数的,可以让前n-1条边权值为1~n-1,第n条边(n->1)可以为n, n+1, n+2从而满足题意,后面再连任意两条不相邻的边时,边权

&lt;Effective C++&gt;读书笔记--Ctors、Dtors and Assignment Operators

<Item 5> Know what functions C++ silently writes and calls 1.If you don't declare them yourself, compilers will declare their own versions of a copy constructor, a copy assignment operator, and a destructor. Furthermore, if you declare no constructo

POJ 3189 Steady Cow Assignment(最大流)

POJ 3189 Steady Cow Assignment 题目链接 题意:一些牛,每个牛心目中都有一个牛棚排名,然后给定每个牛棚容量,要求分配这些牛给牛棚,使得所有牛对牛棚的排名差距尽量小 思路:这种题的标准解法都是二分一个差值,枚举下界确定上界,然后建图判断,这题就利用最大流进行判断,值得一提的是dinic的效率加了减枝还是是卡着时间过的,这题理论上用sap或者二分图多重匹配会更好 代码: #include <cstdio> #include <cstring> #inclu

hdu 1845 Jimmy’s Assignment (二分图)

Jimmy's Assignment Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 896    Accepted Submission(s): 379 Problem Description Jimmy is studying Advanced Graph Algorithms at his university. His most

FreeRTOS的application assignment

Please follow the steps precisely in order to complete the objectives of the assignment. If you use the C++ FreeRTOS framework, it should make the assignment significantly easy. Create a producer task that takes 1 light sensor value every 1ms. Collec

用户无法进入SDSF,报NO GROUP ASSIGNMENT错误

注:命令行小写部分表出需要根据自己的情况改变!! a)激活SDSF资源类 SETROPTS CLASSACT(SDSF) b)查看SDSF资源类的PROFILE RLIST SDSF * c)如果不存在GROUP.ISFUSER.servername的PROFILE,则需要定义, RDEFINE SDSF (GROUP.ISFUSER.servername) OWNER(userid or group name) UACC(READ) 这样,所有用户都可以有读取权限,就都可以访问SDSF了 附1