委托是一种类型,可以实例化。
常用泛型委托。
new Predicate<T>(函数名) ,,必须要有一个输入参数,只能有一个参数,并且需要返回bool类型。
new Action<T,T..>(函数名),可以有0-16个输入参数,不能有返回值。
new Func<T,T...>(函数名),可以有0-16个输入参数,最后加一个参数标示返回的值的类型,必须有返回值。
匿名函数:
var s1 = new Predicate<string>(delegate(string item)
{
return string.IsNullOrEmpty(item);
});
匿名函数简写:
var s1 = new Predicate<string>(delegate(string item)
{
return string.IsNullOrEmpty(item);
});
var s2 = new Predicate<string>((string item) =>
{
return string.IsNullOrEmpty(item);
});
var sdf = new Action<string>((string item) => {
});
var sdfsdf = new Action<string>(a=>Console.WriteLine(a));
迭代器
static IEnumerable<int> GetIterator() { Console.WriteLine("迭代器返回了1"); yield return 1; Console.WriteLine("迭代器返回了2"); yield return 2; Console.WriteLine("迭代器返回了3"); yield return 3; }
foreach (var i in GetIterator()) { if (i == 2) { break; } Console.WriteLine(i); } Console.ReadKey();
输出结果为:
迭代器返回了1 1 迭代器返回了2
大家可以看到:
当迭代器返回2之后,foreach就退出了
并没有输出“迭代器返回了3”
也就是说下面的工作没有做。
(3)yield 关键字
MSDN中的解释如下:
在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。
也就是说,我们可以在生成迭代器的时候,来确定什么时候终结迭代逻辑
上面的代码可以改成如下形式:
static IEnumerable<int> GetIterator() { Console.WriteLine("迭代器返回了1"); yield return 1; Console.WriteLine("迭代器返回了2"); yield break; Console.WriteLine("迭代器返回了3"); yield return 3; }
(4)注意事项
<1>做foreach循环时多考虑线程安全性
在foreach时不要试图对被遍历的集合进行remove和add等操作
任何集合,即使被标记为线程安全的,在foreach的时候,增加项和移除项的操作都会导致异常
(我在这里犯过错)
<2>IEnumerable接口是LINQ特性的核心接口
只有实现了IEnumerable接口的集合
才能执行相关的LINQ操作,比如select,where等
这些操作,我们接下来会讲到。
也就是说,只有实现了IEnumerable接口,就可以使用这些扩展方法
Linq
查询操作符
过滤
Where
OfType arr.OfType<int>()
Where
用法:arr.Where(a => { return a > 3; })
说明:找到集合中满足指定条件的元素
OfType
用法:arr.OfType<int>()
说明:根据指定类型,筛选集合中的元素
学习地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html