程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> Linq學習(5) 集合操作

Linq學習(5) 集合操作

編輯:關於C#

本篇介紹Linq的集合操作,繼續使用《Linq 學習(3) 語法結構》中介紹的數據源。

Count/LongCount

Count/LongCount 返回結果集中元素的數量,返回類型分別為int/long。

原型為:

public static int Count<TSource>(this IEnumerable<TSource> source[, Func<TSource, bool> predicate])

姓名長度大於四個字符的學生的數量:

var result = (from student in DataSource.Students
       select student).Count(stu => { return stu.Name.Length > 4; }); // result: 1

Sum/Min/Max/Average

分別返回結果集元素或其屬性的和、最小值、最大值、平均值。

Sum:返回集合元素的和,參與計算的集合元素必須為基本的值類型或可空類型。

計算總分:

var result = (from score in DataSource.Scores

select score).Sum(score => { return score.Value; });

Min/Max:結果集元素的最大值或最小值,要求集合元素實現IComparable<T> 或 IComparable接口。

選擇最高成績:

var result = (from score in DataSource.Scores
       select score).Max(score => { return score.Value; }); // result: 96

Average:返回集合元素的平均值,參與計算的集合元素必須為基本的值類型或可空類型。

計算平均成績:

var result = (from score in DataSource.Scores
       select score).Average(score => { return score.Value; }).ToString("F2"); // result: 75.23

Union

聯合兩個擁有相同或相似元素的集合,不去掉重復元素。

Union原型為:

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)

var result = DataSource.Students.Union(DataSource.Students2);

// result: 兩個集合的所有元素的集合。

Aggregate

Aggregate是最靈活的操作符,有些前面Sum/Min/Max/Average不支持的類型可以自己定義其實現。

Aggregate原型為:

public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector)

source

要聚合的 IEnumerable<(Of <(T>)>)。

seed

累加器的初始值。

func

要對每個元素調用的累加器函數。

resultSelector

將累加器的最終值轉換為結果值的函數。

返回所有學生的姓名字符串(相當於自定義Sum):

var result = (from student in DataSource.Students
       select student.Name)
       .Aggregate("Name:", (a, b) => a + " " + b, c => c + "\n");
// result: Name: Andy Bill Cindy Dark

選擇的學生姓名(按字符串排序取最大的,相當於實現Max):

var result = (from student in DataSource.Students
       select student.Name).Aggregate((a, b) => string.Compare(a, b) > 0 ? a : b);
// result: Dark

算分數的平均值(返回Score對象,相當於自定義Average):

var collection = from score in DataSource.Scores
       select score;
var result = collection.Aggregate(new Score { Value = 0 },
  (a, b) => { return new Score { Value = a.Value + b.Value }; },
  c => new Score { Value = c.Value / collection.Count() }).Value.ToString("F2");
// result: 75.23

Aggregate 可以靈活的實現各種自定義的功能。

集合操作會影響Linq的執行效率,因為執行集合操作時會遍歷甚至多次遍歷集合元素;對Linq的延遲執行也會變為立即執行,後面介紹性能優化時會討論。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved