首页 新闻 会员 周边 捐助

C# lambda、List的拓展方法

0
[已解决问题] 解决于 2012-07-04 14:53
 1 public partial class _Default : System.Web.UI.Page 
 2 {
 3     protected void Page_Load(object sender, EventArgs e)
 4     {
 5         List<int> lst = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//创建数字序列
 6         var query = lst.MyWhere(itm => itm %2 == 0);//调用MyWhere操作符过滤偶数
 7         foreach (var item in query)//将过滤的偶数输出到页面
 8         {
 9             Response.Write(item.ToString() + ",");
10         }
11     }
12 }
13 
14 /// <summary>
15 /// 实现自已的where操作符
16 /// </summary>
17 static class ExtendMethod
18 {
19     public static IEnumerable<TSource> MyWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
20     {
21         foreach (TSource s in source)
22         {
23             if (predicate(s))
24             {
25                 yield return s; 
26             }
27         }
28     }
29 }

还是没能弄懂,为什么MyWhere<TSource>这个方法这样写就成为List<int>的拓展方法?然后是怎样运行筛选出0,2,4,6,8?

望高手详细指点一下,感谢!

AaronLi的主页 AaronLi | 初学一级 | 园豆:41
提问于:2012-06-20 17:24
< >
分享
最佳答案
0

这个是.NET新语言(好像是C#4.0才有的)的特性。至于为什么,就没有必要去了解了,这个是.NET的内部机制实现的一个特殊功能。

我们,作为开发员,会用就好。

假如你真的想知其所以然,那会很辛苦,特别是你问的这个技术。。。不会有多少大牛真的去较真的。

作为推荐,推荐一本书《CLR VIA C#》,会对你有所帮助的。

奖励园豆:5
无之无 | 大侠五级 |园豆:5095 | 2012-06-20 17:28

还有我不明白

Func<TSource, bool> predicate
这个要怎样传入一个方法?

itm => itm %2 == 0
这个是不是itm对应TSource,itm%2==0对应bool?
AaronLi | 园豆:41 (初学一级) | 2012-06-20 18:23

@xiao黎: 对。

itm => itm %2 == 0

等价于:

bool fun(TSource itm)

{

return itm % 2 == 0;

}

无之无 | 园豆:5095 (大侠五级) | 2012-06-20 19:21

@笨笨蜗牛: 

那我写成↓:

bool fun(TSource itm)

{

return itm % 2 == 0;

}

是把fun作MyWhere方法参数传过去吗?

AaronLi | 园豆:41 (初学一级) | 2012-06-20 19:33

@xiao黎: 可以,但是这样,就没有生成SQL的效果了。

无之无 | 园豆:5095 (大侠五级) | 2012-06-20 21:34

@笨笨蜗牛: 就没有生成SQL的效果了。请问这个是什么意思?

AaronLi | 园豆:41 (初学一级) | 2012-06-21 09:44

@xiao黎: 也就是说,没办法达到SQL级别的优化。

你这样写的条件,在程序运行上是OK的,但在执行的性能上,因为QUERY生成的SQL里不会包含这些条件内容,所以,性能会有所下降。

无之无 | 园豆:5095 (大侠五级) | 2012-06-21 10:00
其他回答(1)
0

新的语法糖,刚开始用着不习惯,慢慢就习惯了!

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-06-20 18:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册