我有一个名为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;来扩展它吗?代表与普通代表?或类似的东西?
答案 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;原件,但你可以删除多余的功能
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;
在扩展方面,我认为这涵盖了扩展最多的案例(除非您单独订购和选择)。
或许解释为什么你想要这样做会有用吗?