2011-03-05 55 views
2

我想專門瞭解爲什麼這裏有必要有這個API Where<TSource>Enumerable.Where - 如何閱讀

什麼後直Where告訴你的類型?

我明白了「這個」的概念,這意味着它的一個擴展方法但cannoth理解後凡

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 
+3

也許你需要閱讀泛型? http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx – 2011-03-05 16:37:32

回答

3

Func<TSource, bool>是一個指針,指向這需要TSource作爲參數並返回布爾值的函數的類型。例如,如果你有以下功能:

public bool Foo(SomeType abc) 
{ 
    return abc.SomeProperty == "123"; 
} 

,你可以把它作爲參數傳遞給Where方法,如果你有的SomeType列表:

SomeType[] values = ... 
var result = values.Where(Foo); 

你也可以使用匿名函數可避免你需要明確地聲明另一個函數:

SomeType[] values = ... 
var result = values.Where(x => x.SomeProperty == "123"); 

UPD ATE:

我似乎誤解了這個問題。函數名稱Where<TSource>後面的類型表示generic function定義。它表明這個函數有一個可以是任何類型的泛型參數。因此,例如,當你寫:

SomeType[] values = ... 
var result = values.Where(x => x.SomeProperty == "123"); 

TSource等於SomeType和編譯器能夠從委託自動推斷它。你可以明確指定,但它太寫作:

SomeType[] values = ... 
IEnumerable<SomeType> result = values.Where<SomeType>(x => x.SomeProperty == "123"); 
+1

我的問題不是關於參數或返回類型 - 我的問題是爲什麼你需要一個類型here'Where ' – 2011-03-05 16:38:32

+0

@ChloeRadshaw,這是因爲它是一個通用的方法定義。 'TSource'表示泛型類型。 – 2011-03-05 16:40:28

+0

什麼類型的輸入或輸出?而這不是params/return類型的類型? – 2011-03-05 16:41:32

0

一個簡單的回答你的問題將是類型安全和智能感知,而編程。 (泛型提供的所有優點)。

LINQ to Objects適用於名爲Enumerable的類型中定義的擴展方法。大多數情況下,他們處理類型IEnumerable<T>

因此,舉例來說,當你希望它在List<String>運行,Where<TSource>變得Where<String>。和C#3.0類型的排除進入圖片,以便您不必明確指定String部分。因爲編譯器知道你在使用IEnumerable<T>

要sumarrize,當您使用Where方法上的列表,所述方法預計的IEnumerable<String>Predicate其需要String對輸入序列篩選作爲輸入,並用IEnumerable<String>作爲輸出提供。

1

<...>的類型之後是通用類型參數的聲明。 Where方法是通用的,這意味着在使用方法時可以提供其類型聲明中涉及的某些類型。在C#中,這被稱爲泛型

<...>是您聲明使用方法時調用者需要指定的類型的地方。這是,在某些方面,類似的參數

  • 當使用參數的聲明,你說的調用者需要給你一些價值觀,你給他們的名字(例如sourcepredicate)。

  • 當編寫泛型方法時,你說調用者需要給你一些類型,並給這個類型一個名稱(例如TSource),你可以在方法聲明和正文中使用它。