C#中yield关键字用法(以及delegate/Lambde/Linq之间的关系)

2 篇文章 0 订阅
1 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值