打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CSDN 论坛


一。初始方法


static void FindOddNumbers()
        {
            var nums = Enumerable.Range(1, 10).ToList();
            var result = new List();
            foreach(var num in nums)
            {
                if (num % 2 != 0)
                {
                    result.Add(num);
                }
            }
            foreach(var num in result)
            {
                Console.WriteLine(num);
            }

        }


二。把筛选方法提取成单独的方法,功能独立
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EvolutionToLinq
{
    class Program
    {
        static void Main(string[] args)
        {
            FindOddNumbers();
            Console.ReadKey();
        }
        static bool IsOdd(int num)
        {
            return num % 2 != 0;
        }
        static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            var result = new List();
            //筛选数据
            foreach(var num in nums)
            {
                if (IsOdd(num))
                {
                    result.Add(num);
                }
            }
            //输出结果
            foreach(var num in result)
            {
                Console.WriteLine(num);
            }

        }
    }
}

三。处理数据的方法提取。数据处理和显示分离

static bool IsOdd(int num)
        {
            return num % 2 != 0;
        }
        static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            IEnumerable result = FilterIntegers(nums);
            //输出结果
            foreach (var num in result)
            {
                Console.WriteLine(num);
            }

        }

        private static IEnumerable FilterIntegers(IEnumerable nums)
        {
            var result = new List();
            //筛选数据
            foreach (var num in nums)
            {
                if (IsOdd(num))
                {
                    result.Add(num);
                }
            }

            return result;
        }


四/引入委托,允许外部修改筛选方法

public delegate bool PredicateDelegate(int value);//是一个类,应该写到类外面。里面也可以,但是外面好。
        static bool IsEven(int num)
        {
            return num % 2 == 0;
        }
        
        static bool IsOdd(int num)
        {
            return num % 2 != 0;
        }
        static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            IEnumerable result = FilterIntegers(nums,IsOdd);
            //这里就可以随便用筛选方法了
            //IEnumerable result = FilterIntegers(nums, IsEven);
            //输出结果
            foreach (var num in result)
            {
                Console.WriteLine(num);
            }

        }

        private static IEnumerable FilterIntegers(IEnumerable nums,PredicateDelegate predicate)
        {
            var result = new List();
            //筛选数据
            foreach (var num in nums)
            {
                if (predicate(num))
                {
                    result.Add(num);
                }
            }

            return result;
        }


五,引入泛型,这样筛选方法和具体的类型脱钩,可以使方法适应更多的情形。

public delegate bool PredicateDelegate(T value);

static bool IsEven(int num)
        {
            return num % 2 == 0;
        }
        
        static bool IsOdd(int num)
        {
            return num % 2 != 0;
        }
        static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            IEnumerable result = Filter(nums,IsOdd);
            //IEnumerable result = FilterIntegers(nums, IsEven);
            //输出结果
            foreach (var num in result)
            {
                Console.WriteLine(num);
            }

        }

        private static IEnumerable Filter(IEnumerable nums,PredicateDelegate predicate)
        {
            var result = new List();
            //筛选数据
            foreach (var num in nums)
            {
                if (predicate(num))
                {
                    result.Add(num);
                }
            }

            return result;
        }

六,用.net自带委托Func

//之前的delegate可以删除了。
 private static IEnumerable Filter(IEnumerable nums,Func predicate)
        {
            var result = new List();
            //筛选数据
            foreach (var num in nums)
            {
                if (predicate(num))
                {
                    result.Add(num);
                }
            }

            return result;
        }

七,用Lambda表达式替换方法参数


//isOdd。和IsEven可以删除了。
static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            IEnumerable result = Filter(nums,num=>num%2!=0);
            //IEnumerable result = FilterIntegers(nums, num=>num%2==0);
            //输出结果
            foreach (var num in result)
            {
                Console.WriteLine(num);
            }

        }


八,引入扩展方法,继续精简代码,把处理的数据功能增强,看起来像是数据本身的方法
现在的方法跟类型脱钩,并且适应面非常广。只要有IEnumberable接口都行。

static void FindOddNumbers()
        {
            //原数据
            var nums = Enumerable.Range(1, 10).ToList();
            IEnumerable result = nums.Filter(num => num % 2 != 0);
            //IEnumerable result = FilterIntegers(nums, IsEven);
            //输出结果
            foreach (var num in result)
            {
                Console.WriteLine(num);
            }

        }
//原Filter方法删除
public static class MyExtensions
    {
        public static IEnumerable Filter(this IEnumerable list, Func predicate)
        {
            var result = new List();
            //筛选数据
            foreach (var num in list)
            {
                if (predicate(num))
                {
                    result.Add(num);
                }
            }

            return result;
        }
    }

九。用yield关键字节省内存的使用。不用出现List,大大节约内存。

public static class MyExtensions
    {
        public static IEnumerable Filter(this IEnumerable list, Func predicate)
        {
            
            //筛选数据
            foreach (var num in list)
            {
                if (predicate(num))
                {
                    yield return num;
                }
            }
            
        }
    }

十。把Filter换成Where。就是Linq的Where方法了~~~~




本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linq之前的C#知识
通过反编译得到System.Core程序集中System.Linq命名空间下的Enumerable类
lambda表达式之进化
查询表达式(LINQ)简介
Linq之旅:Linq入门详解(Linq to Objects)
C#学习笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服