一、標(biāo)準(zhǔn)查詢(xún)運(yùn)算符
1、概念
標(biāo)準(zhǔn)查詢(xún)運(yùn)算符由一系列 API 方法組成,API 能讓我們查詢(xún)?nèi)魏?.NET 數(shù)組或集合。
標(biāo)準(zhǔn)運(yùn)算符的要點(diǎn):
-
標(biāo)準(zhǔn)查詢(xún)運(yùn)算符使用方法語(yǔ)法。
-
一些運(yùn)算符返回 Ienumerable 對(duì)象(或其他序列),而其他運(yùn)算符返回標(biāo)量。返回標(biāo)量的運(yùn)算符立即執(zhí)行查詢(xún),并返回一個(gè)值,而不是一個(gè)可枚舉類(lèi)型對(duì)象。ToArray()、ToList() 等 ToCollection 運(yùn)算符也會(huì)立即執(zhí)行。
-
很多操作都以一個(gè)謂詞作為參數(shù)。謂詞是一個(gè)方法,它以對(duì)象為參數(shù),根據(jù)對(duì)象是否滿足某個(gè)條件而返回 true 或 false.
-
被查詢(xún)的集合對(duì)象叫作序列,它必須實(shí)現(xiàn) IEnumerable<T>接口,其中 T 是類(lèi)型。
-
用作方法的運(yùn)算符直接作用于序列對(duì)象,在這里就是 numbers 數(shù)組。
-
返回類(lèi)型不是 Ienumerable 對(duì)象,而是 int。
class Program
{
static int[] numbers = new int[] { 2, 4, 6 };
static void Main(string[] args)
{
int total = numbers.Sum();
int howMany = numbers.Count();
Console.WriteLine($"Total:{ total },Count:{ howMany }");
Console.ReadKey();
}
}
//標(biāo)量對(duì)象:int
//序列:numbers
//運(yùn)算符:Count()
表-20-1標(biāo)準(zhǔn)查詢(xún)運(yùn)算符
運(yùn)算符名 | 描述 |
---|---|
Where | 根據(jù)給定的謂詞對(duì)序列進(jìn)行過(guò)濾 |
Select | 指定要包含一個(gè)對(duì)象或?qū)ο蟮囊徊糠?/td> |
SelectMany | 一種查詢(xún)類(lèi)型,返回集合的集合。該方法將這些結(jié)果合并為一個(gè)單獨(dú)的集合 |
Take | 接受一個(gè)輸入?yún)?shù) count,返回序列中的前 count 個(gè)對(duì)象 |
Skip | 接受一個(gè)輸入?yún)?shù) count,跳過(guò)序列中的前 count 個(gè)對(duì)象,返回剩余對(duì)象 |
TakeWhile | 接受一個(gè)謂詞,開(kāi)始迭代序列,只要謂詞對(duì)當(dāng)前項(xiàng)的計(jì)算結(jié)果為 true,就選擇該項(xiàng)。在謂詞返回第一個(gè) false 的時(shí)候,該項(xiàng)和其余項(xiàng)都被丟棄 |
SkipWhile | 接受一個(gè)謂詞,開(kāi)始迭代序列,只要謂詞對(duì)當(dāng)前項(xiàng)的計(jì)算結(jié)果為 true,就跳過(guò)該項(xiàng)。在謂詞返回第一個(gè) false 的時(shí)候,該項(xiàng)和其余項(xiàng)都會(huì)被選擇 |
Join | 對(duì)兩個(gè)序列執(zhí)行內(nèi)聯(lián)結(jié)。 |
GroupJoin | 可以產(chǎn)生層次結(jié)果的聯(lián)結(jié),第一個(gè)序列中的各個(gè)元素都與第二個(gè)序列中的元素集合相關(guān)聯(lián) |
Concat | 連接兩個(gè)序列 |
OrderBy/ThenBy | 根據(jù)一個(gè)或多個(gè)鍵對(duì)序列中的元素按升序排序 |
Reverse | 反轉(zhuǎn)序列中的元素 |
GroupBy | 分組序列中的元素 |
Distinct | 去除序列中的重復(fù)項(xiàng) |
Union | 返回兩個(gè)序列的并集 |
Intersect | 返回兩個(gè)序列的交集 |
Except | 操作兩個(gè)序列。返回的是第一個(gè)序列中不重復(fù)的元素減去同樣位于第二個(gè)序列中的元素 |
AsEnumerable | 將序列作為 IEumerable <TSource> 返回 |
ToArray | 將序列作為數(shù)組返回 |
ToList | 將序列作為L(zhǎng)ist <T> 返回 |
ToDictionary | 將序列作為 Dictionary<TKey,TElement>返回 |
ToLookup | 將序列作為 LookUp<TKey,TElement>返回 |
OfType | 所返回的序列中的元素是指定的類(lèi)型 |
Cast | 將序列中所有的元素強(qiáng)制轉(zhuǎn)換為給定的類(lèi)型 |
SequenceEqual | 返回一個(gè)布爾值,指定兩個(gè)序列是否相等 |
First | 返回序列中第一個(gè)與謂詞匹配的元素。如果沒(méi)有元素與謂詞匹配,就拋出 InvalidOperation-Exception |
FirstOrDefault | 返回序列中第一個(gè)與謂詞匹配的元素。如果沒(méi)有給出謂詞,方法返回序列的第一個(gè)元素。如果沒(méi)有元素與謂詞匹配,就使用該類(lèi)型的默認(rèn)值 |
Last | 返回序列中最后一個(gè)與謂詞匹配的元素。如果沒(méi)有元素與謂詞匹配,就拋出 InvalidOperation-Exception |
LastOrDefault | 返回序列中最后一個(gè)與謂詞匹配的元素。如果沒(méi)有元素與謂詞匹配,就返回默認(rèn)值 |
Single | 返回序列中與謂詞匹配的單個(gè)元素。如果沒(méi)有元素匹配,或多于一個(gè)元素匹配,就拋出異常 |
SingleOrDefault | 返回序列中與謂詞匹配的單個(gè)元素。如果沒(méi)有元素匹配,或多于一個(gè)元素匹配,就返回默認(rèn)值 |
ElementAt | 給定一個(gè)參數(shù) n,返回序列中第 n + 1 個(gè)元素 |
ElementAtOrDefault | 給定一個(gè)參數(shù) n,返回序列中第 n + 1 個(gè)元素。如果索引超出范圍,就返回默認(rèn)值 |
DefaultIfEmpty | 提供一個(gè)在序列為空(empty)時(shí)的默認(rèn)值 |
Range | 給定一個(gè) start 整型和 count 整型,該方法返回的序列包含 count 個(gè)整型,其中第一個(gè)元素的值為 start,每個(gè)后續(xù)元素都比前一個(gè)大 1 |
Repeat | 給定一個(gè) T 類(lèi)型的 element 和一個(gè) count 整數(shù),該方法返回的序列具有 count 個(gè) elemen 副本 |
Empty | 返回給定類(lèi)型 T 的空序列 |
Any | 返回一個(gè)布爾值,指明序列中是否存在滿足謂詞的元素 |
All | 返回一個(gè)布爾值,指明序列中的全部元素是否都滿足謂詞 |
Contains | 返回一個(gè)布爾值,指明序列中是否包含給定的元素 |
Count | 返回序列中元素的個(gè)數(shù)(int)。它的重載可以接受一個(gè)謂詞,并返回序列中滿足謂詞的元素個(gè)數(shù) |
Sum | 返回序列中值的總和 |
Min | 返回序列中最小的值 |
Max | 返回序列中最大的值 |
Average | 返回序列中值的平均值 |
Aggregate | 連續(xù)對(duì)序列中的各個(gè)元素應(yīng)用給定的函數(shù) |
2、標(biāo)準(zhǔn)查詢(xún)運(yùn)算符的簽名
System.Linq.Enumerable 類(lèi)聲明了標(biāo)準(zhǔn)查詢(xún)運(yùn)算符方法。它們是擴(kuò)展了 IEnumerable<T>泛型類(lèi)的擴(kuò)展方法。
如 3個(gè)標(biāo)準(zhǔn)查詢(xún)運(yùn)算符的簽名:Count、First 和 Where。
- 1)由于運(yùn)算符是泛型方法,因此每個(gè)方法名都具有相關(guān)的泛型參數(shù)(T)。
- 2)由于運(yùn)算符是擴(kuò)展 IEnumerable 類(lèi)的擴(kuò)展方法,它們必須滿足下面的語(yǔ)法條件。
聲明為 public 和 static。
在第一個(gè)參數(shù)前有 this 擴(kuò)展指示器。
把 IEnumerable<T>作為第一個(gè)參數(shù)類(lèi)型。
public static int Count<T>(this IEnumerable<T> source);
public static T First<t>(THIS IEnumerable<T> source);
public static IEnumerable<T> where<T>(this IEnumerable<T> source, ...);
//this:擴(kuò)展治時(shí)期
示例:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-504471.html
static void Main(string[] args)
{
int[] intArray = new int[] { 3, 4, 5, 6, 7, 9 };
var count1 = Enumerable.Count(intArray);//方法語(yǔ)法
var firstNum1 = Enumerable.First(intArray);//方法語(yǔ)法
var count2 = intArray.Count();//擴(kuò)展方法
var firstNum2 = intArray.First();//擴(kuò)展方法
Console.WriteLine($"Count:{ count1 }, FirstNumber:{ firstNum1 }");
Console.WriteLine($"Count:{ count2 }, FirstNumber:{ firstNum2 }");
Console.ReadKey();
}
輸出結(jié)果:
Count:6, FirstNumber:3
Count:6, FirstNumber:3
3、查詢(xún)表達(dá)式和標(biāo)準(zhǔn)查詢(xún)運(yùn)算符
兩者可以組合使用,示例:
static void Main(string[] args)
{
var numbers = new int[] { 2, 6, 4, 8, 10 };
int howMany = (from n in numbers
where n < 7
select n).Count();
Console.WriteLine($"Count:{ howMany }");
Console.ReadKey();
}
輸出結(jié)果:
Count:3
4、將委托作為參數(shù)
要點(diǎn):
- 泛型委托用于給運(yùn)算符提供用戶(hù)自定義的代碼。
簽名:
//運(yùn)算符形式
public static int Count<T>(this IEnumerable<T> source);
//添加泛型委托參數(shù),接受單個(gè)T類(lèi)型的輸入?yún)?shù)并返回布爾值的委托對(duì)象
//委托代碼的返回值必須指定元素是否應(yīng)包含在總數(shù)中。
public static int Count<T>(this IEnumerable<T> source,
Func<T,bool> predicate);
//泛型委托: Func<T,bool> predicate
使用 Lambda 示例:
static void Main(string[] args)
{
int[] intArray = new int[] { 3, 4, 5, 6, 7, 9 };
var countOdd = intArray.Count(n => n % 2 == 1);
Console.WriteLine($"Count of odd numbers:{ countOdd }");
Console.ReadKey();
}
輸出結(jié)果:
Count of odd numbers:4文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-504471.html
.NET 框架定義了兩套泛型委托類(lèi)型來(lái)用于標(biāo)準(zhǔn)查詢(xún)運(yùn)算符,即 Func 委托和 Action 委托。
Func 委托:
public delegate TR Func<out TR>();
public delegate TR Func<in T1, out TR>(T1 a1);
public delegate TR Func<in T1, in T2, out TR>(T1 a1, T2 a2);
public delegate TR Func<in T1, in T2, in T3, out TR>(T1 a1, T2 a2, T3 a3);
- 返回類(lèi)型參數(shù)中 out 關(guān)鍵字,使之協(xié)變。
- 輸入?yún)?shù)有一個(gè) in 關(guān)進(jìn)啊,使之可以逆變。
Action 委托:
public delegate void Action ();
public delegate void Action<in T1> (T1 a1);
public delegate void Action<in T1, in T2> (T1 a1, T2 a2);
public delegate void Action<in T1, in T2, in T3> (T1 a1, T2 a2, T3 a3);
使用委托參數(shù)的示例
class Program
{
static bool IsOdd(int x) //委托對(duì)象使用的方法
{
return x % 2 == 1;
}
static void Main(string[] args)
{
int[] intArray = new int[] { 3, 4, 5, 6, 7, 9 };
Func<int, bool> myDel = new Func<int, bool>(IsOdd);//委托對(duì)象
var countOdd = intArray.Count(myDel);//使用委托
Console.WriteLine($"Count of odd numbers:{ countOdd }");
Console.ReadKey();
}
}
輸出結(jié)果:
Count of odd numbers:4
5、使用 Lambda 表達(dá)式參數(shù)的示例
示例:
static void Main(string[] args)
{
int[] intArray = new int[] { 3, 4, 5, 6, 7, 9 };
var countOdd = intArray.Count( x => x % 2 == 1);
Console.WriteLine($"Count of odd numbers:{ countOdd }");
Console.ReadKey();
}
//Lambda 表達(dá)式:x => x % 2 == 1
6、匿名方法替代 Lambda 表達(dá)式
static void Main(string[] args)
{
int[] intArray = new int[] { 3, 4, 5, 6, 7, 9 };
Func<int, bool> myDel = delegate (int x)
{
return x % 2 == 1;
};
var countOdd = intArray.Count(myDel);
Console.WriteLine($"Count of odd numbers:{ countOdd }");
Console.ReadKey();
}
到了這里,關(guān)于(十一)CSharp-LINQ-標(biāo)準(zhǔn)查詢(xún)運(yùn)算符(3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!