IEnumerable<T>接口主要功能是提供了大量与查询相关的方法,虽然这些方法实际上是以扩展方法的形式定义,但也不影响IEnumerable<T>接口的功能性。
IEnumerable<T>接口
IEnumerable<T>泛型接口支持在制定数据集合上进行迭代操作。它定义了一组扩展方法,用来对数据集合中的元素进行遍历、过滤、排序、搜索等操作。在LINQ中,数据源实际上是实现了接口IEnumerable<T>的类,通过select子句返回的查询结果页是一个实现了IEnumerable<T>的类。
在.NET类库中,IEnumerable<T>接口提供了大量与查询相关的方法。这些方法实际上是以扩展方法的形式定义,但是由于它的作用类型也为IEnumerable<T>接口,所以使用上和成员方法很类似。
IEnumerable<T>接口主要成员
对序列应用累加器函数,可以指定累加方法
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
连接两个序列,直接首尾相连。返回结果可能存在重复数据
获取两个元素集合的差集,可以指定相等比较方法
此方法返回未显示在 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";
获取两个元素集合的交集,可以指定相等比较方法
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