更新於 2024/09/13閱讀時間約 11 分鐘

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

環境準備

語法說明

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

參考資料

本篇已同步發表至個人部落格 https://moushih.com/2022ithome14/
鐵人賽文章
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.