2015-08-09 52 views
1

我很困惑LINQ求和方法是如何工作的。 因此,我們有例如一個int陣列和INT結構不具有sum方法。Enumerable.Sum如何綁定到數組類型?

但是當我們包括LINQ,奇蹟般地它。 總和方法如何添加到結構中,以便我們可以調用arr.sum()?通過某種繼承或如何?

回答

7

如何被添加到結構

大多數集合類實現IEnumerable<T>總和法。 Sum,在你的榜樣,是IEnumerable<T>extension method

擴展方法基本上是靜態類用靜態方法,其中每個方法的第一值被加到所述​​this關鍵字。這樣,編譯器將其識別爲應用於該類型的擴展方法。

這裏是Enumerable.Sum在它的上IEnumerable<decimal>宣佈最簡單的形式:

public static decimal Sum(this IEnumerable<decimal> source) 
{ 
    if (source == null) throw Error.ArgumentNull("source"); 
    decimal sum = 0; 
    foreach (decimal v in source) sum += v; 
    return sum; 
} 

還有的Sum許多重載,每一個不同類型的組成和浮點類型的。如果你有興趣,他們可以找到here。 所有擴展方法都應用於給定類型。假設一個數組實現了IEnumerable<T>,它也將這些方法作爲附加。

+0

所以你告訴我,任何類型的相匹配的擴展方法的參數,可以使用像它分機方法是其中的一部分(使用。運算符)? – CuriousGuy

+2

@CuriousGuy這就是我所說的,是的。你可以自己嘗試一下。爲「int」或「string」創建一個擴展方法,並查看魔術的發生。 –

+3

@CuriousGuy他不僅在說,它也是如此。 – Martijn