前言
在Dotnet開發過程中,Any作為IEnumerable的擴展方法,十分常用。本文對Any方法的關鍵源碼進行簡要分析,以方便大家日后更好的使用該方法。
使用
Any?確定序列中是否包含元素或存在元素滿足指定條件。
看這樣一個例子,我們判斷集合中是否存在元素
List<UserInforMation>?lstUserInforMations?=?new?List<UserInforMation>();
bool?flag?=?lstUserInforMations.Any();
flag=?lstUserInforMations.Any(o=>o.Sex=="男");
當然flag都為false。
我們現在給集合賦值
//賦值
lstUserInforMations?=?new?List<UserInforMation>?
{new?UserInforMation{UserName="張三",Sex="男"},new?UserInforMation{UserName="李四",Sex="女"},
};
flag?=?lstUserInforMations.Any();
flag?=?lstUserInforMations.Any(o?=>?o.Sex?==?"男");
只要有一個條件滿足,當然就會返回true了
源碼解析
第一個方法
public?static?bool?Any<TSource>(this?IEnumerable<TSource>?source)
參數
source 元素的類型
返回值
bool
該方法表示 只要有一個元素存在就返回True,否則返回false。
IEnumerable修飾我們的源元素類型,那么我們就知道源元素是一個 可以獲得循環訪問集合的枚舉器那么我們就可以使用GetEnumerator這個方法進行迭代了。
然后我們在使用MoveNext方法,來遍歷集合的元素!
源碼:
public?static?bool?Any<TSource>(this?IEnumerable<TSource>?source)
{if?(source?==?null){throw?null;}using?(IEnumerator<TSource>?enumerator?=?source.GetEnumerator())
{if?(enumerator.MoveNext()){eturn?true;}}return?false;
}
第二個方法
public?static?bool?Any<TSource>(this?IEnumerable<TSource>?source,?Func<TSource,?bool>?predicate)
參數
source 元素的類型
Func<TSource, bool> predicate 該委托用于判斷某元素是否滿足某個條件,這個func委托接收一個和源元素相同的參數類型,并返回一個bool!
返回值
bool
我們在第一個方法上改進,使用foreach遍歷源元素,如果有一個滿足我們就返回true
源碼:
public?static?bool?Any<TSource>(this?IEnumerable<TSource>?source,?Func<TSource,?bool>?predicate){if?(source?==?null){throw?null;}if?(predicate?==?null){throw?null;}foreach?(TSource?item?in?source){if?(predicate(item)){return?true;}}return?false;
}
總結
在我們了解了any的源碼后,我們在判斷集合為空的時候是不是使用Any()?比Count()?更好一點了呢?歡迎留言討論