筛选器共两类:带有where子句的传统筛选器以及新的筛选器OfType。OfType用于筛选能够转换为特定类型的值。
WHERE子句
var numbers = new int[] { -1, -32, 3, 5, -8, 13, 7, -41 }; // 筛选绝对值大于 5 的数字 var magnitude = from n in numbers where Math.Abs(n) > 5 select n; foreach (var m in magnitude) Console.WriteLine(m);OFTYPE
// 从数组中筛选能够转换成整型的元素 var randomData = new object[] { 1, "two", 3, "four", 5.5, "six", 7M }; var canBeInt = from r in randomData.OfType<int>() select r; foreach (var i in canBeInt) Console.WriteLine(i);Skip、SkipWhile、Take和TakeWhile用于将集合拆分成两个部分并返回其中一个。
var ints = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 获取指定位置之后的元素(包含指定位置的元素) Console.WriteLine("+++++++++++++++++++++Skip+++++++++++++++++++++"); var resultSkip = ints.Skip(3); Array.ForEach(resultSkip.ToArray(), n => Console.Write(n + " ")); // 获取条件为false的元素 Console.WriteLine("+++++++++++++++++++++SkipWhile++++++++++++++++"); var resultSkipWhile = ints.SkipWhile(n => n <= 5); Array.ForEach(resultSkipWhile.ToArray(), n => Console.Write(n + " ")); // 获取指定位置之前的元素(不包含指定位置的元素) Console.WriteLine("+++++++++++++++++++++Take+++++++++++++++++++++"); var resultTake = ints.Take(3); Array.ForEach(resultTake.ToArray(), n => Console.Write(n + " ")); // 获取条件为true的元素 Console.WriteLine("+++++++++++++++++++++TakeWhile++++++++++++++++"); var resultTakeWhile = ints.TakeWhile(n => n <= 5); Array.ForEach(resultTakeWhile.ToArray(), n => Console.Write(n + " "));结果 +++++++++++++++++++++Skip+++++++++++++++++++++ 3 4 5 6 7 8 9 10 +++++++++++++++++++++SkipWhile+++++++++++++++++ 6 7 8 9 10 +++++++++++++++++++++Take+++++++++++++++++++++ 0 1 2 +++++++++++++++++++++TakeWhile+++++++++++++++++ 0 1 2 3 4 5
生成运算包括DefaultIfEmpty、Empty、Range以及Repeat。它们都是用于创建新的序列。
// 根据指定类型创建一个空的序列 var empties = Enumerable.Empty<int>(); Console.WriteLine("Type : {0}", empties.GetType()); Console.WriteLine("Count : {0}", empties.Count()); Console.WriteLine("========================================="); // 如果参数指定的序列为空,则使用指定类型的默认值创建一个数量为1的序列 var default_empties = Enumerable.DefaultIfEmpty<int>(Enumerable.Empty<int>()); Console.WriteLine("Type : {0}", default_empties.GetType()); Console.WriteLine("Count : {0}", default_empties.Count()); Array.ForEach(default_empties.ToArray(), n => Console.WriteLine(n)); Console.WriteLine("========================================="); var range = Enumerable.Range(10, 5); Array.ForEach(range.ToArray(), n => Console.WriteLine(n)); Console.WriteLine("Type : {0}", range.GetType()); Console.WriteLine("Count : {0}", range.Count()); Console.WriteLine("========================================="); var repeat = Enumerable.Repeat(10, 5); Array.ForEach(repeat.ToArray(), n => Console.WriteLine(n)); Console.WriteLine("Type : {0}", repeat.GetType()); Console.WriteLine("Count : {0}", repeat.Count());结果 Type : System.Linq.EmptyPartition1[System.Int32] Count : 0 ========================================= Type : System.Linq.Enumerable+DefaultIfEmptyIterator1[System.Int32] Count : 1 0 ========================================= 10 11 12 13 14 Type : System.Linq.Enumerable+RangeIterator Count : 5 ========================================= 10 10 10 10 10 Type : System.Linq.Enumerable+RepeatIterator`1[System.Int32] Count : 5