Linq:Select和Where有什么区别?

SelectWhere方法在Linq中可用。 每个开发者应该知道这两种方法? 例如:什么时候使用一个,使用哪一个的优点等等。

哪里

find匹配的项目,只返回那些做过滤的项目

– > IEnumerable<A>中, IEnumerable<A> out

select

返回源中所有项目的东西( 投影/转换 )。 有些东西可能是物品本身,但更多的是某种投影。

– > IEnumerable<A>中, IEnumerable<B> out

selectWhere是两个完全不同的操作符IEnumerable s。

第一个是我们所说的投影算子 ,而最后一个是限制算子

了解这类运营商的行为的一个有趣的方法是看看他们的“functiontypes”。

  • select:( IEnumerable <T1>,Func <T1,T2>)→IEnumerable <T2> ; 它将包含types为T1的元素的IEnumerable和将types为T1的元素转换为types为T2的元素的函数作为input。 输出是一个包含T2types元素的IEnumerable。

    从这里可以很容易地猜出这个运算符将通过在inputIEnumerable的每个元素上应用input函数来产生输出,并将结果包装在一个新的IEnumerable中。

    (a,b,c,…):IEnumerable <T1>f:T1→T2并产生(f(a),f(b),f(c) ,…):IEnumerable <T2>

  • 其中:(IEnumerable <T1>,Func <T1,bool>)→IEnumerable <T1> ; 这个接受一个I​​Enumerable,它包含T1types的元素和一个在T1上的谓词(也就是一个产生T1typesinput的布尔结果的函数)。 您会看到输出也是一个包含T1types元素的IEnumerable。

    这次可以猜测inputIEnumerable的元素将会出现在输出IEnumerable上,这取决于谓词对元素的应用结果。 通过添加操作符名称的语义,可以确保它将生成输出IEnumerable,方法是从input中只生成那些谓词应用程序的值为true的元素。

function编程背景的人通常会这样想。 它可以让你推断(或者至less猜测)一个操作员只要看看它的types就可以做什么!

作为练习,在查看文档之前,尝试查看由LINQ在IEnumerables上引入的其他运算符并推断它们的行为。

他们是不同的:

Select是关于转型

Where关于过滤

select将可枚举映射到新结构。 如果您在IEnumerable上执行select,您将获得具有相同数量的元素的数组,但具有不同的types,具体取决于您指定的映射。 在哪里筛选IEnumerable,以便它可以为您提供原始IEnumerable的子集。

如果你知道他们如何实现Where和select扩展方法,你可以预测它在做什么…我试图实现的地方,并select扩展方法…你可以看看它…

何处执行::

 public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method ) { foreach ( var data in a ) { //If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return) if ( Method.Invoke ( data ) ) { yield return data; } } } 

select执行::

 public static IEnumerable<TResult> Select<TSource , TResult> ( this IEnumerable<TSource> a , Func<TSource , TResult> Method ) { foreach ( var item in a ) { //Each iteration call the delegate and return the Data back.(use 'yield' for deferred return) yield return Method.Invoke ( item ); } } 

我的实现工作正常的任何集合…但它不同于微软实施扩展方法,因为他们使用expression式树来实现相同的。