前言
在Dotnet開(kāi)發(fā)過(guò)程中,Any作為IEnumerable的擴(kuò)展方法,十分常用。本文對(duì)Any方法的關(guān)鍵源碼進(jìn)行簡(jiǎn)要分析,以方便大家日后更好的使用該方法。
使用
Any 確定序列中是否包含元素或存在元素滿(mǎn)足指定條件。
看這樣一個(gè)例子,我們判斷集合中是否存在元素
List lstUserInforMations = new List();bool flag = lstUserInforMations.Any();flag= lstUserInforMations.Any(o=>o.Sex==”男”);
當(dāng)然flag都為false。
我們現(xiàn)在給集合賦值
//賦值lstUserInforMations = new List { new UserInforMation{UserName=”張三”,Sex=”男”}, new UserInforMation{UserName=”李四”,Sex=”女”},};flag = lstUserInforMations.Any();flag = lstUserInforMations.Any(o => o.Sex == “男”);
只要有一個(gè)條件滿(mǎn)足,當(dāng)然就會(huì)返回true了
源碼解析
第一個(gè)方法
public static bool Any(this IEnumerable source)
參數(shù)
- source 元素的類(lèi)型
返回值
- bool
該方法表示 只要有一個(gè)元素存在就返回True,否則返回false。
IEnumerable修飾我們的源元素類(lèi)型,那么我們就知道源元素是一個(gè) 可以獲得循環(huán)訪問(wèn)集合的枚舉器那么我們就可以使用GetEnumerator這個(gè)方法進(jìn)行迭代了。
然后我們?cè)谑褂肕oveNext方法,來(lái)遍歷集合的元素!
源碼:
public static bool Any(this IEnumerable source){ if (source == null) { throw null; } using (IEnumerator enumerator = source.GetEnumerator()){ if (enumerator.MoveNext()) { eturn true; } }return false;}
第二個(gè)方法
public static bool Any(this IEnumerable source, Func predicate)
參數(shù)
- source 元素的類(lèi)型
- Func predicate 該委托用于判斷某元素是否滿(mǎn)足某個(gè)條件,這個(gè)func委托接收一個(gè)和源元素相同的參數(shù)類(lèi)型,并返回一個(gè)bool!
返回值
- bool
我們?cè)诘谝粋€(gè)方法上改進(jìn),使用foreach遍歷源元素,如果有一個(gè)滿(mǎn)足我們就返回true
源碼:
public static bool Any(this IEnumerable source, Func predicate) { if (source == null) { throw null; } if (predicate == null) { throw null; } foreach (TSource item in source) { if (predicate(item)) { return true; } } return false;}
總結(jié)
在我們了解了any的源碼后,我們?cè)谂袛嗉蠟榭盏臅r(shí)候是不是使用Any() 比Count() 更好一點(diǎn)了呢?歡迎留言討論