2013-02-20 52 views
0

我知道Linq的Any()擴展名用於確定一個枚舉是否至少有一個元素,它只會消耗一個元素。但實際上這是如何工作的?它是否必須首先將所有物品放在可枚舉物體中,還是一次只投出一個物體,從第一個開始並停在那裏?LinQ Any()是否強制集合中的所有項目?

+4

爲什麼你甚至會懷疑演員陣容? – 2013-02-20 16:49:26

+3

我懷疑你正在使用'cast'來表示除了普遍接受的含義之外的東西。你認爲這意味着什麼? – AakashM 2013-02-20 16:50:46

回答

4

Any()適用於IEnumerable<T>因此不需要轉換。它的實現非常簡單,它只是遍歷枚舉並查看它是否可以找到任何匹配指定條件的元素。

+1

這對於需要一個函數的重載來說,另一個無參數重載,同時分享一個名字,行爲完全不同。 – Servy 2013-02-20 16:54:17

+0

是的。並非所有版本都有謂詞。但總的想法是一樣的:是否有任何元素,可選地匹配給定的標準?無論哪種情況,數據都不需要轉換。 – 2013-02-20 16:55:57

+0

而且不帶謂詞的版本基本上是'Any(x => true)'的墊片。 – GalacticCowboy 2013-02-20 17:03:54

2

簡單實現的樣子:

public bool Any<T>(IEnumerable<T> list) 
{ 
    using (var enumerator = list.GetEnumerator()) 
    { 
     return enumerator.MoveNext(); 
    } 
} 

所以,沒有任何鑄件所需

+0

LINQ版本是通用的,您需要處理枚舉器,並且不會檢查輸入序列,但除此之外道德上相同。 – Servy 2013-02-20 16:55:05

+0

@Servy:謝謝,我知道,只是爲了便於理解而簡化它 – 2013-02-20 16:56:32

+0

空檢查和泛型並不重要,但處置枚舉器確實是,並且不應該被省略。 – Servy 2013-02-20 16:57:22

1

代碼公共靜態類Enumerable

public static bool Any<TSource>(this IEnumerable<TSource> source) { 
    if(source==null) { 
     throw Error.ArgumentNull("source"); 
    } 
    using(IEnumerator<TSource> enumerator=source.GetEnumerator()) { 
     if(enumerator.MoveNext()) { 
      return true; 
     } 
    } 
    return false; 
} 

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { 
    if(source==null) { 
     throw Error.ArgumentNull("source"); 
    } 
    if(predicate==null) { 
     throw Error.ArgumentNull("predicate"); 
    } 
    foreach(TSource local in source) { 
     if(predicate(local)) { 
      return true; 
     } 
    } 
    return false; 
} 

沒有見過鑄造,但通用的。

相關問題