代码之家  ›  专栏  ›  技术社区  ›  lexu

问:选择和在哪里有什么区别?

  •  101
  • lexu  · 技术社区  · 7 年前

    这个 Select Where 方法在LINQ中可用。对于这两种方法,每个开发人员应该知道什么?例如:当使用一个比另一个的时候,使用一个比另一个的任何优势,等等。

    6 回复  |  直到 7 年前
        1
  •  98
  •   Drew Noakes    11 年前

    在哪里?

    查找匹配的项,只返回匹配的项( 过滤 )

    -gt; IEnumerable<A> 在, IEnumerable<A> 外面的

    选择

    为…退货 全部的 源中的项( 投影/变换 )有些东西可能是物品本身,但通常是某种投影。

    -gt; IEnumerable<A> 在, IEnumerable<B> 外面的

        2
  •  42
  •   Bruno Reis    17 年前

    选择 在哪里? 两个完全不同的操作人员 可枚举的 S.

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

    了解此类运算符行为的一个有趣方法是查看它们的“函数类型”。

    • 选择:(IEnumerable<T1>、Func<T1、T2>)→IEnumerable<T2> ;它接受包含T1类型元素的IEnumerable和将T1类型元素转换为T2类型元素的函数作为输入。输出是包含t2类型的元素的IEnumerable。

      由此,可以很容易地猜测,通过对输入IEnumerable的每个元素应用输入函数,并将结果包装在新的IEnumerable中,该运算符将生成其输出。

      使用一些数学符号作为输入 (A、B、C,…):IEnumerable<T1> F:T1~T2 并生产 (f(a)、f(b)、f(c)、…):IEnumerable<t2>

    • 其中:(IEnumerable<T1>、func<T1、bool>)→IEnumerable<T1> ;此函数接受包含T1类型的元素和T1上的谓词的IEnumerable(即,为T1类型的输入生成布尔结果的函数)。您可以看到输出也是一个包含T1类型元素的IEnumerable。

      这一次,根据谓词应用于元素的结果,可以猜测输入IEnumerable的元素将出现在输出IEnumerable上。在此基础上,再加上运算符名称的语义,您可以确保它将从输入中仅获取那些在谓词应用程序上计算为true的元素,从而生成输出IEnumerable。

    人带 函数式编程 背景通常是这样想的。它允许您通过查看一个操作符的类型来推断(或者至少猜测…)它做了什么!

    作为练习,在查看文档之前,请尝试查看Linq在IEnumerable上引入的其他运算符,并推断它们的行为!

        3
  •  39
  •   bruno conde    17 年前

    它们是不同的:

    Select 都是关于 转型 .

    Where 都是关于 过滤 .

        4
  •  16
  •   Steve    17 年前

    选择将可枚举的映射到新结构。如果在IEnumerable上执行Select,将得到一个元素数相同但类型不同的数组,具体取决于指定的映射。其中过滤IEnumerable,以便它为您提供原始IEnumerable的子集。

        5
  •  7
  •   Sanu Uthaiah Bollera    12 年前

    如果您知道它们是如何实现在哪里并选择扩展方法的,那么您可以预测它在做什么…… 我尝试实现Where并选择扩展方法…你可以看看它…

    实施地点:

    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;
            }
        }
    }
    

    选择实现:

    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 );
        }
    }
    

    对于任何集合,我的实现都可以正常工作…但它不同于Microsoft实现的扩展方法,因为它们使用表达式树来实现相同的扩展方法。

        6
  •  1
  •   Zhenyang Hua    7 年前

    Where ~=滤波器

    Select ~=地图

    两个回报 IEnumerable<T>