技术开发 频道

LINQ项目-更多标准查询操作符


  Select 和 GroupBy 允许您提供用于填充组成员的投影函数。
string[] names = { "Albert", "Burke", "Connor", "David", "Everett", "Frank", "George", "Harris"}; // group by length var grouping = names.GroupBy(s => s.Length, s => s[0]); foreach (Grouping group in grouping) { Console.WriteLine("Strings of length {0}", group.Key); foreach (char value in group.Group) Console.WriteLine(" {0}", value); }
  该变体会显示以下结果:
Strings of length 6 A C G H Strings of length 5 B D F Strings of length 7 E
  从该示例中可以注意到,投影类型不需要与源相同。在本例中,我们从字符串序列创建了整数-字符的分组。

  聚合操作符

  定义几个标准查询操作符,以便将一列值聚合到单个值中。最常见的聚合操作符是 Fold,它定义如下:
public static U Fold(this IEnumerable source, U seed, Func func) { U result = seed; foreach (T element in source) result = func(result, element); return result; }
  Fold 操作符使得针对值序列进行计算很简单。Fold 的工作方法是,为底层序列的每个成员调用一次 λ 表达式。每次 Fold 调用 λ 表达式时,都会传递序列的成员和一个聚合值(初始值基于 Fold 的种子参数)。λ 表达式的结果会替换先前的聚合值,Fold   将返回 λ 表达式的最终结果。

  例如,以下程序使用 Fold 针对一个字符串数组计算总字符数:
string[] names = { "Albert", "Burke", "Connor", "David", "Everett", "Frank", "George", "Harris"}; int count = names.Fold(0, (c, s) => c + s.Length); // count == 46
  除了通用的 Fold 操作符,标准查询操作符还包含一个通用的 Count 操作符和四个数值聚合操作符(Min、Max、Sum 和 Average),以便简化这些常见的聚合操作。只要提供将序列成员投影到数值类型的函数,数值聚合函数就可以处理数值类型的序列(例如,int、 double、decimal)或任意值序列。

  以下程序演示 Sum 操作符的上述两种形式:
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; string[] names = { "Albert", "Burke", "Connor", "David", "Everett", "Frank", "George", "Harris"}; int total1 = numbers.Sum(); // total1 == 55 int total2 = names.Sum(s => s.Length); // total2 == 46
  请注意,第二个 Sum 语句等效于前面使用 Fold 的示例。

  Select 与 SelectMany

  Select 操作符要求转换函数为源序列中的每个值生成一个值。如果转换函数返回的值本身就是一个序列,则应该由使用者手动遍历子序列。例如,请考虑以下程序,该程序使用现有的 String.Split 方法将字符串拆分为标记:
string[] text = { "Albert was here", "Burke slept late", "Connor is happy" }; var tokens = text.Select(s => s.Split(' ')); foreach (string[] line in tokens) foreach (string token in line) Console.Write("{0}.", token);
0
相关文章