我试图明确了解为什么有这个Where<TSource>
Where
告诉你的类型是什么?
我理解'this'这个概念,这意味着它是一个扩展方法,但是了解了Where
之后的类型public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
答案 0 :(得分:3)
Func<TSource, bool>
是指向函数的指针,该函数将TSource
作为参数并返回布尔值。例如,如果您具有以下功能:
public bool Foo(SomeType abc)
{
return abc.SomeProperty == "123";
}
如果你有一个SomeType
列表:
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#中,这称为泛型。
<...>
是一个声明调用者在使用方法时需要指定的类型的地方。它在某种程度上类似于参数声明
使用参数时,您说调用者需要为您提供一些值,并为其指定名称(例如source
和predicate
)。
在编写泛型方法时,您说调用者需要为您提供某种类型,并为类型指定一个名称(例如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>
作为输出。