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?
望高手详细指点一下,感谢!
这个是.NET新语言(好像是C#4.0才有的)的特性。至于为什么,就没有必要去了解了,这个是.NET的内部机制实现的一个特殊功能。
我们,作为开发员,会用就好。
假如你真的想知其所以然,那会很辛苦,特别是你问的这个技术。。。不会有多少大牛真的去较真的。
作为推荐,推荐一本书《CLR VIA C#》,会对你有所帮助的。
还有我不明白
Func<TSource, bool> predicate
这个要怎样传入一个方法?
itm => itm %2 == 0
这个是不是itm对应TSource,itm%2==0对应bool?
@xiao黎: 对。
itm => itm %2 == 0
等价于:
bool fun(TSource itm)
{
return itm % 2 == 0;
}
@笨笨蜗牛:
那我写成↓:
bool fun(TSource itm)
{
return itm % 2 == 0;
}
是把fun作MyWhere方法参数传过去吗?
@xiao黎: 可以,但是这样,就没有生成SQL的效果了。
@笨笨蜗牛: 就没有生成SQL的效果了。请问这个是什么意思?
@xiao黎: 也就是说,没办法达到SQL级别的优化。
你这样写的条件,在程序运行上是OK的,但在执行的性能上,因为QUERY生成的SQL里不会包含这些条件内容,所以,性能会有所下降。
新的语法糖,刚开始用着不习惯,慢慢就习惯了!