Linq查询扩展

时间:2015-03-12 15:11:21

标签: c# linq delegates func anonymous-methods

我有一个名为Products&的字符串数组。我正在研究Anonymous Methods(Lambda Exprs。)& LINQ。 所以我先写了一下;

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

然后我用Lambda Expressions扩展它;

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

然后我用Anonymous Methods扩展它;

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

然后我用手动方法和Func<>扩展它。代表;

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&lt;&gt;来扩展它吗?代表与普通代表​​?或类似的东西?

2 个答案:

答案 0 :(得分:2)

  

然后我用Lambda Expressions扩展它......

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

  

然后我用匿名方法扩展它

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

  

我可以将Func<>委托替换为普通代表吗?

是的,你可以。使用与Func<>匹配的签名在类中定义静态方法,并使用它们而不是匿名函数或委托。您可以使用方法组语法使委托缩短代码:

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

答案 1 :(得分:0)

确定 &#34; de-sugar&#34;原件,但你可以删除多余的功能

&#13;
&#13;
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; }
&#13;
&#13;
&#13;

在扩展方面,我认为这涵盖了扩展最多的案例(除非您单独订购和选择)。

或许解释为什么你想要这样做会有用吗?