【问题标题】:c# syntax and Linq, IQueryablec#语法和Linq,IQueryable
【发布时间】:2010-05-18 11:43:55
【问题描述】:

这是一个关于 c# 的 SYNTAX 的问题,NOT 是关于我们如何调用/使用 IQueryable

谁能给我解释一下:

我们有这个声明(System.Linq):

public static double Average<TSource>(this IQueryable<TSource> source,
                                      Expression<Func<TSource, int>> selector)

并调用平均值

double average = fruits.AsQueryable().Average(s => s.Length);

我了解如何调用 Average 和 IQueryable 的所有类似静态方法 但我不明白声明的语法。

public static double Average<TSource>(this IQueryable<TSource> source,
                                      Expression<Func<TSource, int>> selector)

Average&lt;TSource&gt;(中的&lt;TSource&gt;是什么意思 还有this IQueryable&lt;TSource&gt; source

因为我们调用它时只传递了一个参数和实际的 lambda 表达式(s =&gt; s.Length);

提前致谢。

【问题讨论】:

    标签: c# linq iqueryable


    【解决方案1】:

    &lt;TSource&gt; 部分声明了方法的通用类型参数 - 基本上是序列包含的元素类型。在深入了解 LINQ 之前,您绝对应该了解泛型。

    那么,

    this IQueryable<TSource> source
    

    表示方法的第一个参数:

    • this 表示它是extension method
    • IQueryable&lt;TSource&gt;表示参数的类型
    • source 是参数的名称

    它是一种扩展方法这一事实可能会让您感到困惑。当你打电话时

    query.Average(s => s.Length)
    

    由编译器转换成

    Queryable.Average(query, s => s.Length)
    

    【讨论】:

    • 这里你可以找到更多关于扩展方法的信息:msdn.microsoft.com/en-us/library/bb383977.aspx 扩展方法用于 1. 扩展一个类型而不需要从它继承 2. 实现对所有类型都有效的方法来实现某个特定接口
    • 非常感谢!你说得很清楚。不知道扩展方法的语法!
    【解决方案2】:

    您正在声明一个扩展方法(即this 关键字),它将您的方法添加到实现IQueryable&lt;TSource&gt; 的任何类型中,其中TSource 是泛型类型,并且在整个表达式中保持不变。

    这种情况下编译器可以推断出泛型类型,所以调用方法时不需要声明

    【讨论】:

      【解决方案3】:

      TSource 是您将声明的泛型类型。基本上就是s是什么类型。

      【讨论】:

        【解决方案4】:

        Average&lt;TSource&gt;,因为这是Generic Method。该方法可以在任何类型的查询或枚举上运行(只要提供了适合该类型的选择器)。

        this IQueryable&lt;TSource&gt; source,因为这是一个Extension Method。扩展方法允许您向现有类型添加其他方法,而无需更改该类型的定义。在这种情况下,Linq 将 Average 方法添加到 IQueryable 接口而不更改该接口

        【讨论】:

        • 另一个完整的答案!谢谢!
        【解决方案5】:
        1. &lt;TSource&gt; 是方法的通用参数。
        2. this IQueryable&lt;TSource&gt; source 表示扩展方法,这是语法糖。在 C#2.0 中,它只是一个您必须显式调用的静态方法,因此,编译器允许您调用它,就好像它是您调用它的类型的成员一样。

        【讨论】:

          【解决方案6】:

          &lt;X&gt; 用于制作适用于不同类型的通用函数。

          X add<X>(X a, X b){return a + b;}
          
          int a = 1;
          int b = 2;
          int c = add<int>(a,b);
          
          string d = "hello ";
          string e = "world";
          string f = add<string>(c,d);
          

          这是扩展方法的关键字:

          string putinsidestars(this string x){
            return "*" + x + "*";
          }
          
          string foo = "bar";
          string z = foo.putinsidestars();
          // z now contains *bar*
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-16
            • 1970-01-01
            • 2013-06-21
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2020-04-23
            • 1970-01-01
            相关资源
            最近更新 更多