.NET Core 核心知识点(三)--Linq的面纱

首先,Linq是由委托和lambda表达式演变而来的。

  • 委托,委托是一种类型,指向具体方法的类型,调用委托变量是执行的就是委托指向的具体方法;
  • .Net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义的委托;
    public delegate int AddDelegate(int a, int b);
    class Program
    {
        static async Task Main(string[] args)
        {
            AddDelegate addDelegate = AddNumber;
            int tatol = addDelegate(1, 3);
            Console.WriteLine($"结果:{tatol}");
        }

        static private int AddNumber(int a, int b)
        {
            return a + b;
        }
    }

 或者用Func泛型委托来代替,如下:

    class Program
    {
        static async Task Main(string[] args)
        {
            Func<int,int,int> action = AddNumber;
            int tatol = action(1, 3);
            Console.WriteLine($"结果:{tatol}");
        }

        static private int AddNumber(int a, int b)
        {
            return a + b;
        }
    }
  • 委托变量不只可以指向普通方法,还可以指向匿名方法,
static async Task Main(string[] args)
{
    Func<int, int, int> funcAdd = delegate (int a, int b)
    {
        return a + b;
    };
    Console.WriteLine($"结果:{funcAdd(1,4)}");
}

 或者使用Lambda表达式的方式,如下:

static async Task Main(string[] args)
{
    Func<int, int, int> funcAdd = (int a, int b) => { return a + b; };
    Console.WriteLine($"结果:{funcAdd(1, 2)}");
}

如果是只有一行代码的逻辑代码,连花括号也不需要 :

static async Task Main(string[] args)
{
    Func<string,string> funcPrint = (string str) =>  str + "hahah";
    Console.WriteLine($"结果:{ funcPrint("24234")}");
}

如果不需要入参,则小括号里面直接为空

static async Task Main(string[] args)
{
   Func<string> funcPrint = () => "hahah";
   Console.WriteLine($"结果:{ funcPrint()}");
}
  • Linq背后:linq背后的实现其实就是委托和lambda表达式,如下,我自定义了一个MyWhere的Linq表达式,与Linq的Where进行对比:

        1.微软自带的Linq的Where条件语句

        static void Main(string[] args)
        {
            int[] numbers = new int[] { 1,2,8,12,3,56,78};

            IEnumerable<int> items = numbers.Where(i => i > 5);

            foreach (var num in items)
            {
                Console.WriteLine(num);
            }
        }

  • 或者,我们可以自定义一个MyWhere表达式,传递一个数组和一个Func的委托,如下:
        static void Main(string[] args)
        {
            int[] numbers = new int[] { 1,2,8,12,3,56,78};
            //定义一个Func泛型的lambda表达式
            Func<int, bool> fun = (a) =>  a > 5;
            foreach (var item in MyWhere(numbers, fun))
            {
                Console.WriteLine(item);
            }
        }
        //自定义的过滤方法
        static IEnumerable<int> MyWhere(int[] item, Func<int, bool> func)
        {
            List<int> result = new List<int>();
            foreach (var data in item)
            {
                if(func(data))
                {
                    result.Add(data);
                }
            }
            return result;
        }
  • 注意,这里我们在返回结果的时候,是先把所有满足条件的数据放到了一个List<int>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值