枚举器和linq

Iterator:枚举器

如果你正在创建一个表现和行为都类似于集合的类,允许类的用户使用foreach语句对集合中的成员进行枚举将会是很方便的。

我们将以创建一个简单化的List Box作为开始,它将包含一个8字符串的数组和一个整型,这个整型用于记录数组中已经添加了多少字符串。构造函数将对数组进行初始化并使用传递进来的参数填充它。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NETTest
{
    /// <summary>
    /// Iterator:枚举器
    /// 测试枚举器,继承IEnumerable,实现IEnumerator<T> GetEnumerator()
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ListBox<T> : IEnumerable<T>
    {
        public List<T> Strings = new List<T>();

        public ListBox(params T[] initialStrings)
        {
            foreach (T s in initialStrings)
            {
                Strings.Add(s);
            }
        }

        IEnumerator<T> IEnumerable<T>.GetEnumerator()//这个方法和下面的方法都必须实现
        {
             foreach (T s in Strings)
             {
                 yield return s;
             }
        }

//GetEnumerator方法使用了新的 yield 语句。yield语句返回一个表达式。yield语句仅在迭代块中出现,
//并且返回foreach语句所期望的值。那也就是,对GetEnumerator的每次调用都//将会产生集合中的下一个字符串;所有的状态管理已经都为你做好了!


        IEnumerator IEnumerable.GetEnumerator()//这个方法和上面的方法都必须实现
        {
            throw new NotImplementedException();
        }
    }
}
class Program
    {
        static void Main(string[] args)
        {
            //ProgramTest p = new ProgramTest(3);
            //p.TestString();

            ListBox<string> lb = new ListBox<string>("wea", "b", "c", "d", "e", "f", "g", "h");
            foreach (string s in lb)
            {
                Console.Write(s + " ");
            }

            Console.WriteLine();
            ListBox<int> lb1 = new ListBox<int>(4, 5, 6, 34);
            foreach (int s in lb1)
            {
                Console.Write(s + " ");
            }
            ListBox<string> lb = new ListBox<string>("wea", "b", "c", "d", "e", "f", "g", "h");
            foreach (string s in lb.Strings)//调用属性
            {
                Console.Write(s + " ");
            }


            Console.ReadLine();
        }
    }


LINQ的基本格式如下所示:
var <变量> = from <项目> in <数据源> where <表达式> orderby <表达式>


group分组子句
语句格式:var str = from p in PersonList group p by p.age
group子句将数据源中的数据进行分组,在遍历数据元素时,并不像前面的章节那样直接对元素进行遍历,因为group子句返回的是元素类型为IGrouping<TKey,TElement>的对象序列,必须在循环中嵌套一个对象的循环才能够查询相应的数据元素。
在使用group子句时,LINQ查询子句的末尾并没有select子句,因为group子句会返回一个对象序列,通过循环遍历才能够在对象序列中寻找到相应的对象的元素,如果使用group子句进行分组操作,可以不使用select子句。

orderby排序子句
语句格式:var str = from p in PersonList orderby p.age select p;
orderby子句中使用descending关键字进行倒序排列
示例代码如下:
var str = from p in PersonList orderby p.age descending select p;
orderby子句同样能够进行多个条件排序,只需要将这些条件用“,”号分割即可
示例代码如下:
var str = from p in PersonList orderby p.age descending,p.name select p;

join连接子句
在LINQ中同样也可以使用join子句对有关系的数据源或数据对象进行查询,但首先这两个数据源必须要有一定的联系
var str = from p in PersonList join car in CarList on p.cid equals car.cid select p;
var innerJoinQuery =
    from cust in customers
    join dist in distributors on cust.City equals dist.City
    select new { CustomerName = cust.Name, DistributorName = dist.Name };
// custQuery is an IEnumerable<IGrouping<string, Customer>>
var custQuery =
    from cust in customers
    group cust by cust.City into custGroup
    where custGroup.Count() > 2
    orderby custGroup.Key
    select custGroup;
string arrays = "hua ying jie.";

            var s = from arra in arrays orderby arra descending select arra;

            List<char> s2 = (from arra in arrays orderby arra descending select arra).ToList();
            char[] s6 = (from arra in arrays orderby arra descending select arra).ToArray();

            IEnumerable<char> s4 = from arra in arrays orderby arra descending select arra;
            IEnumerable<char> s5 = arrays.OrderByDescending(n => n);//这五种实现效果相同
          
时间: 2024-10-11 16:54:54

枚举器和linq的相关文章

C# 枚举器

1:枚举器和可枚举类型 我们知道使用foreach可以遍历数组中的元素.那么为什么数组可以被foreach语句处理呢,下面我们就进行讨论一下这个问题. 2:使用foreach语句 我们知道当我们使用foreach语句的时候,这个语句为我们依次取出了数组中的每一个元素. 例如下面的代码: 1 int[] arr = { 1, 2, 3, 4, 5, 6 }; 2 foreach( int arry in arr ) 3 { 4 Console.WriteLine("Array Value::{0}

C#知识点-枚举器和迭代器

一.几个基本概念的理解 问题一:为什么数组可以使用foreach输出各元素 答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象:枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的当前项 问题二:不用foreach能不能遍历各元素 问题三:什么是可枚举类 答:可枚举类是指实现了IEnumerable接口的类:IEnumerable接口只有一个成员GetEnumerator方法,它返回对象的枚举器 问题四:什么是枚举器 答:实现了IEnumerator接口的枚举器包含三个函数成

for..in遍历,枚举器

#pragma mark ------------for循环遍历集合中的元素------ //创建一个数组,包含5个字符串对象,倒序取出数组中的所有元素,并存储到另一可变数组中 NSArray *array = @[@"1", @"2", @"3", @"4", @"5"]; NSMutableArray *marray = [NSMutableArray arrayWithCapacity:0]; for

oc语法-枚举器

2015-05-14 22:20:56 1:基于块的枚举 枚举器---循环 1 //使用枚举器进行循环操作 2 NSArray* array = @[@"aa",@"bb",@"cc",@"dd",@"ee",@"ff",@"gg"]; 3 [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

枚举器对象与可枚举类型

1.IEnumerator与IEnumerable接口 IEnumerator接口:实现此接口的为枚举器类型,此接口包含3个方法Current.MoveNext.Reset. IEnumerable接口:实现此接口只需实现一个方法GetEnumerator得到一个枚举器. class ColorEnumerator : IEnumerator //实现枚举器接口:Current,MoveNext,Reset共3种方法 { string[] _colors; int _position = -1;

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本号的枚举器(Enumeration)和如今的迭代器(Iterator) 能够使用适配器(adapter)进行转换. 适配器(adapter)代码: /**

c# foreach枚举器

要是自己的类支持foreach ,必须在类中必须有GetEnumerator方法,该方法返回的是一个IEnumerator类型的枚举器; public class MyStruct { public string[] sName = new string[] { "张三", "李四", "王五" }; public IEnumerator GetEnumerator() { return new MyStructEnumerator(sName)

ruby迭代器枚举器

迭代器一个迭代器是一个方法,这个方法里面有yield语句,使用了yield的方法叫做迭代器,迭代器并非一定要迭代,与传递给这个方法的块进行数据传输 yield将数据传给代码快,代码块再把数据传输给yield each方法就是一个迭代器,里面有yield语句 枚举器1 一个枚举器是Enumerable::Enumerator的一个对象,Enumerable是一个模块2 使用枚举器 1.8的时候需要 require 'enumerator',在2.1就不用了3 可以通过new来实例化一个枚举器,但是