C#中yield关键字用法(以及delegate/Lambde/Linq之间的关系)
/// <summary>
/// 未使用yield关键字过滤数据
/// </summary>
//public static IEnumerable<T> Filter<T>(IEnumerable<T> List, Func<T, bool> Func)
//public static IQueryable<T> Filter<T>(IQueryable<T> List, Func<T, bool> Func)
public static IList<T> Filter<T>(IList<T> List, Func<T, bool> Func)
{
IList<T> result = new List<T>();
foreach (var item in List)
{
if (!Func(item)) continue;
result.Add(item);
}
return result;
}
//委托
//.Net 中的委托类似于 C 或 C++ 中的函数指针,委托(Delegate)是面向对象的回调方法,委托允许把函数名称作为参数进行传递。
public void Filter()
{
int[] Number = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IList<int> result = Filter<int>(Number, delegate (int item) { return item > 2 && item < 6; });
Console.WriteLine("delegate");
foreach (var item in result)
{
Console.WriteLine(item);
}
}
//委托协变
public void Filter2()
{
int[] Number = new int[] { 1, 2, 3, 4, 5, 6, 7 };
var result = Filter(Number, (int item) => { return item > 2 && item < 6; });
Console.WriteLine("delegate2");
foreach (var item in result) Console.WriteLine(item);
}
//Lambda:也可以称为匿名函数
//Lambda表达式 (Lambda Expressions)是LINQ实现的另一特性。Lambda 表达式 的作用就是使用函数式语法,将方法实现关联到委托实例。
public void Filter3()
{
int[] Number = new int[] { 1, 2, 3, 4, 5, 6, 7 };
var result = Filter(Number, item => item > 2 && item < 6);
Console.WriteLine("Lambda");
foreach (var item in result) Console.WriteLine(item);
}
/// <summary>
/// 使用yield关键字过滤数据,具有延迟加载的特性。
/// </summary>
public static IEnumerable<T> FilterByYield<T>(IEnumerable<T> List, Func<T, bool> Func)
//public static IQueryable<T> FilterByYield<T>(IQueryable<T> List, Func<T, bool> Func) //函数返回类型"IQueryable<T>"不是迭代器接口类型
//public static IList<T> FilterByYield<T>(IList<T> List, Func<T, bool> Func) //函数返回类型"IList<T>"不是迭代器接口类型
{
foreach (var item in List)
{
if (!Func(item)) continue;
yield return item;
}
}
public void FilterByYield()
{
int[] Number = new int[] { 1, 2, 3, 4, 5, 6, 7 };
var result = FilterByYield(Number, item => item > 2 && item < 6);
Console.WriteLine("Yield");
foreach (var item in result) Console.WriteLine(item);
}
//Linq
//C#3.0已经默认帮我们实现了这个功能。LINQ,语言集成查询(Language Integrated Query)是一组用于C#和Visual Basic语言的扩展。
public void FilterByLinq()
{
int[] Number = new int[] { 1, 2, 3, 4, 5, 6, 7 };
//Number.Where其实就是linq to object
var result = Number.Where(item => item > 2 && item < 6);
Console.WriteLine("Linq");
foreach (var item in result) Console.WriteLine(item);
}
调用
test t= new test();
t.FilterByDelegate();
t.FilterByCovariant();
t.FilterByLambda();
t.FilterByYield();
t.FilterByLinq();
输出
delegate
3
4
5
Covariant
3
4
5
Lambda
3
4
5
Yield
3
4
5
Linq
3
4
5
版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo