LINQ中IEnumerable接口主要成员简介

在LINQ中,数据源和查询结果实际上都是IEnumerable<T>或IQueryable<T>类型对象,所以可以通过使用普通对象的形式(调用方法、使用属性等)对数据源进行查询或使用查询结果数据。

IEnumerable<T>接口主要功能是提供了大量与查询相关的方法,虽然这些方法实际上是以扩展方法的形式定义,但也不影响IEnumerable<T>接口的功能性。

IEnumerable<T>接口

IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作。它定义了一组扩展方法,用来对数据集合中的元素进行遍历、过滤、排序、搜索等操作。在LINQ中,数据源实际上是实现了接口IEnumerable<T>的类,通过select子句返回的查询结果页是一个实现了IEnumerable<T>的类。

在.NET类库中,IEnumerable<T>接口提供了大量与查询相关的方法。这些方法实际上是以扩展方法的形式定义,但是由于它的作用类型也为IEnumerable<T>接口,所以使用上和成员方法很类似。

IEnumerable<T>接口主要成员

  1.1  Aggregate
对序列应用累加器函数,可以指定累加方法

int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  

int sum1 = nums.Sum(); 

int sum2 = nums.Aggregate((i,j)=>i+j); 

同是求和,Sum不再需要额外参数,而Aggregate确还要将一个lambda作为参数

1.2 Aggregate组装字符串

string[] words = new string[] { "Able", "was", "I", "ere", "I", "saw", "Elba"}; 

string s = words.Aggregate((a, n) => a + " " + n); 

Console.WriteLine(s);   //Result is :Able was I ere I saw Elba

1.3 Aggregate反转字符串

string sentence = "the quick brown fox jumps over the lazy dog"// Split the string into individual words. 
string[] words = sentence.Split(' '); // Prepend each word to the beginning of the 
// new sentence to reverse the word order. 
string reversed = words.Aggregate((workingSentence, next) => next + " " + workingSentence); Console.WriteLine(reversed); 
// This code produces the following output: 
// dog lazy the over jumps fox brown quick the

1.4 Aggregate还可以实现异或(^)操作:

byte[] data = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35 };  
byte checkSum = data.Aggregate((a, n) => (byte)(a ^ n));

 

Sum

计算序列中所有元素的和,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

class Package
{
    public string Company { get; set; }
    public double Weight { get; set; }
}
public static void SumEx1()
{
    List<Package> packages = new List<Package> 
    { 
        new Package { Company = "Coho Vineyard", Weight = 25.2 }, 
        new Package { Company = "Lucerne Publishing", Weight = 18.7 }, 
        new Package { Company = "Wingtip Toys", Weight = 6.0 }, 
        new Package { Company = "Adventure Works", Weight = 33.8 } 
    };
    double totalWeight = packages.Sum(pkg => pkg.Weight);
    Console.WriteLine("The total weight of the packages is: {0}", totalWeight);
}

Average

计算序列中所有元素的平均值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

string[] numbers = { "10007""37""299846234235" };  
double average = numbers.Average(num => Convert.ToInt64(num)); 
Console.WriteLine("The average is {0}.", average); 
// This code produces the following output: 
// 
// The average is 99948748093.

Max
计算序列中所有元素的最大值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}
public static void MaxEx4()
{
    Pet[] pets =  { new Pet { Name = "Barley", Age = 8 }, new Pet { Name = "Boots", Age = 4 },  new Pet { Name = "Whiskers", Age = 1 } };
    int max = pets.Max(pet => pet.Age + pet.Name.Length);
    Console.WriteLine("The maximum pet age plus name length is {0}.", max);
}

Min
计算序列中所有元素的最小值,返回值有int、long、float、double、decimal类型,并且可以指定元素到数值的映射方法

All
检查是否序列中所有元素都满足条件,可以指定条件判断方法。如果所有元素都满足条件返回True,否则返回False

Any
检查序列中是否有任何一个元素满足条件,可以指定条件的判断方法。如果有一个以上(含一个)元素满足条件返回True,否则返回False

Contains
检查数据系列中是否包含特定的元素,可以指定相等比较方法

Count
返回序列中满足指定条件的元素的数量,可以指定条件判断方法

LongCount
返回序列中满足指定条件的元素的长数量,可以指定条件判断方法

Cast
将IEnumerable中的元素转换为指定的数据类型

DefaultIfEmpty
返回序列中指定位置的元素。如果序列为空,则返回默认的元素值

ElementAt
返回序列中指定索引处的元素

ElementAtOrDefault
返回序列中指定索引处的元素。如果序列为空,则返回默认值

First
返回序列中满足指定条件的第一个元素,可以指定条件判断方法

FirstOrDefault
返回序列中满足指定条件的第一个元素。如果不存在则返回默认值,也可以指定条件判断方法

Last
返回序列中满足指定条件的最后一个元素,可以指定条件判断方法

LastOrDefault
返回序列中满足指定条件的最后一个元素。如果不存在则返回默认值,也可以指定条件判断方法

Single
返回序列中满足指定条件的唯一元素。如果不止一个元素满足条件会引发一场,可以指定条件判断方法

SingleOrDefault
返回序列中满足指定条件的唯一元素。如果不存在则返回默认值,如果不止一个元素满足条件会引发一场,可以指定条件判断方法

Reverse
反转序列中元素的顺序

Distinct
返回序列中不重复的元素的集合,可以指定相等比较方法

Concat
连接两个序列,直接首尾相连。返回结果可能存在重复数据

 Except
获取两个元素集合的差集,可以指定相等比较方法

此方法返回未显示在 second 中的 first 的元素。它也不返回未显示在 first 中的 second 的元素。

 

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 }; 
double[] numbers2 = { 2.2 };  
IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2); 
foreach (double number in onlyInFirstSet) 
     
  outputBlock.Text += number + "\n";
Intersect
获取两个元素集合的交集,可以指定相等比较方法

Union
获取两个元素集合的并集,可以指定相等比较方法

SequenceEqual

比较两个序列是否相等,可以指定相等比较方法

Where
根据制定条件对集合中元素进行筛选,返回满足条件的元素集合

Skip
跳过序列中指定数量的元素,然后返回剩余的元素

SkipWhile
跳过序列中满足指定条件的元素,然后返回剩余的元素,可以指定条件判断方法

Take
从序列的开头返回指定数量的连续元素

TakeWhile
返回从序列开始的满足指定条件的连续元素,可以指定条件判断方法

ToArray
从IEnumerable创建一个数组

ToList
从IEnumerable创建一个List

从上表可以看出,IEnumerable提供的方法包括数值运算(Sum、Min、Max、Average)、元素数量(Count、LongCount)、取值(First、Last、ElementAt等)、提取子集(Skip、SkipWhile、Take、 TakeWhile、)集合操作(Reverse、Concat、Distinct、Except、Intersect、Union、 SequenceEqual等)。这些方法提供了LINQ所需要的所有操作。

注意:

IEnuerable继承自IEnumerable接口,所以它也包含IEnumerable接口的所有方法,所以还包括Select()、SelectMany()、Repeat()等方法。

另外,IQuery接口从IEnumerable派生而来,通常也可以作为数据源使用,它的使用和IEnumerable类似。


转载:http://blog.sina.com.cn/s/blog_6c762bb30100pssx.html

参考:http://developer.51cto.com/art/200908/143839.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值