【问题标题】:Linq Query ExpandingLinq 查询扩展
【发布时间】:2015-03-12 15:11:20
【问题描述】:

我有一个名为 Products 的字符串数组,我正在研究匿名方法 (Lambda 表达式) 和 Linq。 所以我先写了;

var resultSet1 = from p in products 
                 where p.StartsWith("M") 
                 orderby p descending  
                 select p;

然后我用 Lambda 表达式扩展它;

var resultSet2 = products
                 .Where(p => p.StartsWith("M"))
                 .OrderByDescending(p => p)
                 .Select(p => p);

然后我用匿名方法扩展它;

var resultSet3 = products
                .Where(delegate(string p) { return p.StartsWith("M"); })
                .OrderByDescending(delegate(string p) { return p; })
                .Select(delegate(string p) { return p; });

然后我用 Manual Methods 和 Func Delegates 扩展它;

Func<string, bool> filterFunc = new Func<string, bool>(Filter);
Func<string, string> orderAndSelectFunc = new Func<string, string>(OrderAndSelect);
var resultSet4 = products.Where(filterFunc).OrderByDescending(orderAndSelectFunc).Select(orderAndSelectFunc);

static bool Filter(string p) { return p.StartsWith("M"); }
static string OrderAndSelect(string p) { return p; }

然后我卡住了。所以我的问题是;我可以通过用普通代表替换 Func 代表来扩展它吗?或者类似的东西?

【问题讨论】:

    标签: c# linq delegates func anonymous-methods


    【解决方案1】:

    然后我用 Lambda 表达式扩展它...

    表达式.Select(p =&gt; p) 在流畅的语法中是不必要的。你可以删除它。

    然后我用匿名方法扩展它

    在这种情况下,lambda 只是匿名方法的缩短版本。

    我可以通过将Func&lt;&gt; 代表替换为普通代表来进一步扩展它吗?

    是的,你可以。在您的类中定义具有与您的Func&lt;&gt;s 匹配的签名的静态方法,并使用它们而不是匿名函数或委托。您可以使用方法组语法来制作委托以缩短代码:

    private static bool StartsWithM(string s) {
        return s.StartsWith("M");
    }
    private static string PassThrough(string s) {
        return s;
    }
    ...
    var resultSet4 = products
                .Where(StartsWithM)
                .OrderByDescending(PassThrough)
                .Select(PassThrough); // <<== Again, this can be removed
    

    【讨论】:

      【解决方案2】:

      不确定您希望通过“脱糖”原件来实现什么,但您可以删除多余的功能

      var resultSet4 = products.Where(Filter).OrderByDescending(OrderAndSelect).Select(orderAndSelect);
      
      static bool Filter(string p) { return p.StartsWith("M"); }
      static string OrderAndSelect(string p) { return p; }

      在扩展方面,我认为这涵盖了最扩展的情况(除非您将 Order 和 Select 分开)。

      也许对你想要这样做的原因的解释会有所帮助?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多