iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Software Development

玩轉C# 進階學習之旅系列 第 14

玩轉C#之【LINQ 語法介紹】

  • 分享至 

  • xImage
  •  

環境準備

準備用測試資料

語法說明

Where

應用場景:過濾、查詢等功能
說明:與SQL命令中的where功能相似,都是過濾範圍內的數值

例如:使用where篩選,年紀大於30的同學

List<Student> students = GetStudentList();
var student = students.Where(x=>x.Age > 30);

First

應用場景:篩選出第一筆資料,但資料如果是空的會跳Exception
說明:返回集合中的第一個元素,其實就是SQL命令中加上TOP(1)

簡單用法:
例如:讀取第一筆學生資料

List<Student> students = GetStudentList();
var student = students.First();

2.加入條件:

例如:讀取學生年紀小於25的第一筆資料

List<Student> students = GetStudentList();
var student = students.First(x=>x.Age < 25);

FirstOrDefault

應用場景:篩選出第一筆資料,但資料有可能是空的
說明:返回集合中的第一個元素,其實就是SQL命令中加上TOP(1)

例如:讀取學生年紀小於1的第一筆資料

List<Student> students = GetStudentList();
var student = students.FirstOrDefault(x=>x.Age < 1);

Select

應用場景:指定想要"拿到的資料"
說明:和SQL命令中的Select作用相似,查詢表達是中的Select及所接子句是放在表達是最後並把子句中的變數也就是結果返回回來,延遲。

簡單用法:
例如:取得年紀大於5的學生的姓名

List<Student> students = GetStudentList();
var student = students.Where(x=>x.Age >5).Select(x=>x.Name);

2.匿名用法:

例如:取得年紀大於5的學生姓名及班級的匿名類別

List<Student> students = GetStudentList();
var student = students.Where(x => x.Age > 5).Select(x =>new{x.Name,x.Age});

3.條件形式:

说明:生成SQL語法為:case when condition then else。

例如:取得年紀大於5的學生姓名及班級的匿名類別

List<Student> students = GetStudentList();
var student = students.Select(x =>new{x.Name,age = x.Age > 25?”老妹”:”正妹”});

4.指定類型型態

例如:已經有一個Girl類別,要將學生的類別資料輸出給Girl

public class Girl
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Student> students = GetStudentList();
var student = students.Select(x =>new Girl{Name = x.Name,Age = x.Age});

5.Distinct
說明:篩選字段中不相同的值。用于查询不重复的结果集。生成SQL語法為:SELECT DISTINCT [Age] FROM [Students]

List<Student> students = GetStudentList();
var student = students.Select(x =>x.Age).Distinct();

Count/Sum/Min/Max/Avg用法雷同
應用場景:統計資料,求資料數量、總和、最小值、最大值、平均值

Count

說明:返回集合中的元素各數,返回INT型別:不延遲。產生SQL語法:SELECT COUNT(*) FROM

簡單用法:
例如:計算學生總數

List<Student> students = GetStudentList();
var student = students.Count();

2.帶入條件:

例如:計算年紀大於30的學生總數

List<Student> students = GetStudentList();
var student = students.Count(x=>x.Age>30);

LongCount
說明:返回集合元素各數,返回LONG型別;不延遲,對於元素各數較多的集合可是情況選用LongCount來統計數量,比較精準,生成SQL語法為:SELECT COUNT_BIG(*) FROM

例如:計算學生總數

List<Student> students = GetStudentList();
var student = students.LongCount();

Sum
說明:返回集合中數值型別元素之和,集合應為INT類型;不延遲。生成SQL語法為:SELECT SUM(…) FROM

Min
說明:返回集合中元素的最小值;不延遲,生成SQL語法為:SELECT MIN(…) FROM

MAX
說明:返回集合中元素的最大值;不延遲,生成SQL語法為:SELECT MAX(…) FROM

Average
說明:返回集合中數值類型元素的平均值,集合應為數字型別集合,返為值型別為double;不延遲,生成SQL語法為SELECT AVG(…) FROM

Aggregate
說明:根據輸入的表達式獲取聚合值;不延遲。

1.第一種用法:

public static TSource Aggregate<TSource>( this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
func 第一個參數:初始值是元素第一筆資料,並且會是之前元素的回傳結果
func 第二個參數:目前元素資料
func 回傳值:第一個參數最後的結果

反編譯:

public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func)
 {
 if (source == null)
 {
 throw Error.ArgumentNull(“source”);
 }
 if (func == null)
 {
 throw Error.ArgumentNull(“func”);
 }
 using (IEnumerator<TSource> enumerator = source.GetEnumerator())
 {
 if (!enumerator.MoveNext())
 {
 throw Error.NoElements();
 }
 TSource val = enumerator.Current;
 while (enumerator.MoveNext())
 {
 val = func(val, enumerator.Current);
 }
 return val;
 }
 }

例如:要計算陣列元素的總和

int[] Source = new int[] { 2, 7, 5, 1, 6, 8, 3 };
Source.Aggregate((total, next) => total + next)

2.第二種用法:

public static TAccumulate Aggregate<TSource, TAccumulate>( this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
seed: 初始值(自定義)
Func:彙整資料所做的處理函式
func第一個參數:初始值是seed,並且會是之前元素的回傳結果
func 第二個參數:目前元素資料
func 回傳值:第一個參數最後的結果

反編譯:

public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func)
 {
 if (source == null)
 {
 throw Error.ArgumentNull(“source”);
 }
 if (func == null)
 {
 throw Error.ArgumentNull(“func”);
 }
 TAccumulate val = seed;
 foreach (TSource item in source)
 {
 val = func(val, item);
 }
 return val;
 }

例如:將60再加上陣列每一個元素的總和

int[] Source = new int[] { 2, 7, 5, 1, 6, 8, 3 };
Source.Aggregate(60,(total, next) => total + next);

第三種用法:

public static TResult Aggregate<TSource, TAccumulate, TResult>( this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
seed: 初始值(自定義)
Func:彙整資料所做的處理函式
func第一個參數:初始值是seed,並且會是之前元素的回傳結果
func 第二個參數:目前元素資料
func 回傳值:第一個參數最後的結果
第二個Func會將第一個func最後計算的結果當輸入參數

參考資料

語言整合式查詢 (LINQ) (C#)

本篇已同步發表至個人部落格
https://moushih.com/2022ithome14/


上一篇
玩轉C#之【LINQ 基本介紹】
下一篇
玩轉C#之【表達式目錄樹】
系列文
玩轉C# 進階學習之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言