Enumerable.Where - 如何阅读API

时间:2011-03-05 16:34:05

标签: c#

我试图明确了解为什么有这个Where<TSource>

是必要的

Where告诉你的类型是什么?

我理解'this'这个概念,这意味着它是一个扩展方法,但是了解了Where

之后的类型
public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, bool> predicate
)

3 个答案:

答案 0 :(得分:3)

Func<TSource, bool>是指向函数的指针,该函数将TSource作为参数并返回布尔值。例如,如果您具有以下功能:

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

如果你有一个SomeType列表:

,你可以将它作为参数传递给Where方法
SomeType[] values = ...
var result = values.Where(Foo);

您还可以使用匿名函数,避免需要明确声明另一个函数:

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

更新:

我似乎误解了这个问题。函数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 :(得分:1)

<...>之后的Where中的类型是泛型类型参数的声明。 Where方法是通用的,这意味着在使用该方法时可以提供其类型声明中涉及的某些类型。在C#中,这称为泛型

<...>是一个声明调用者在使用方法时需要指定的类型的地方。它在某种程度上类似于参数声明

  • 使用参数时,您说调用者需要为您提供一些值,并为其指定名称(例如sourcepredicate)。

  • 在编写泛型方法时,您说调用者需要为您提供某种类型,并为类型指定一个名称(例如TSource),您可以在方法声明和正文中使用。

答案 2 :(得分:0)

您的问题的简单答案将是编程时的类型安全和IntelliSense。 (泛型提供的所有好处)。

LINQ to Objects适用于名为Enumerable的类型中定义的扩展方法。大多数情况下,他们处理类型IEnumerable<T>

因此,例如,当您希望它在List<String>上运行时,Where<TSource>变为Where<String>。并且C#3.0类型的感知进入了图片,因此您不必明确指定String部分。因为,编译器知道您正在使用IEnumerable<T>

要进行sumarrize,当你在List上使用Where方法时,该方法需要一个IEnumerable<String>和一个Predicate,它将String过滤输入序列作为输入,并提供一个IEnumerable<String>作为输出。