linq的推导和原理
- 为啥要学 LINQ
- 委托
- Lambda 表达式怎么来的
- 揭秘 LINQ
为啥要学 LINQ
让数据处理变得简单
Linq的使用 C#编程之Linq-语言集成查询
委托
1、委托是可以指向方法的类型,屌用委托变量时执行的就是变量执向的方法。
2、.NET中定义了泛型委托 Action(无返回值)和 Func(有返回值),所以一般不用自定义委托类型。
static void Main(string[] args)
{
DelegateTest delegateTest = DelegateFun;
delegateTest();
}
static void DelegateFun()
{
Console.WriteLine("被委托调用");
}
// 委托声明 必须与被调用方法的返回值类型、参数类型、参数个数一致
delegate void DelegateTest();
Lambda 表达式怎么来的
Lambda 表达式推导
static void Main(string[] args)
{
Action action = delegate ()
{
Console.WriteLine("匿名方法");
};
action();
Action<int, int> action1 = delegate (int n, int m)
{
Console.WriteLine($"n={n},m={m}");
};
action1(2, 3);
Func<int, int, int> func = delegate (int n, int m)
{
return n + m;
};
Console.WriteLine(func(1, 2));
/* lambda 表达式 推导*/
Func<int, int, int> func1 = (int n, int m) =>
{
return n + m;
};
// 无返回值
Action action2 = () => Console.WriteLine("匿名方法");
// 有返回值
Func<int, int, int> func3 = (n, m) => n + m;
// 只有一个参数,且无返回值
Action<string> action3 = s => Console.WriteLine(s);
// 有一个参数,有返回值
Func<int, bool> func4 = n => n > 3;
// lambda 反推 匿名方法
Func<int, bool> f1 = i => i > 5;
Func<int, bool> f2 = delegate (int i)
{
return i > 5;
};
}
揭秘 LINQ
Linq 使用时 用的是 System.Linq
程序集中的扩展方法
下面模拟 System.Linq
程序集中的方法 实现查询出数据中大于10的数字
因为不是扩展方法所以调用时有些许差别
using System;
using System.Collections.Generic;
using System.Linq;
static void Main(string[] args)
{
int[] nums = new int[] { 12, 23, 3, 4, 2, 234, 123 };
// 自定义实现
IEnumerable<int> result = MyWhere(nums, a => a > 10);
foreach (var item in result)
{
Console.WriteLine(item);
}
IEnumerable<int> result2 = MyWhere2(nums, a => a > 10);
foreach (var item in result)
{
Console.WriteLine(item);
}
// Linq
var data = nums.Where(x => x > 10);
foreach (var item in data)
{
Console.WriteLine(item);
}
}
// 实现方式1
static IEnumerable<int> MyWhere(IEnumerable<int> items, Func<int, bool> func)
{
List<int> list = new List<int>();
foreach (int item in items)
{
if (func(item))
{
list.Add(item);
}
}
return list;
}
// 实现方式2 效率相较于1更高
static IEnumerable<int> MyWhere2(IEnumerable<int> items, Func<int, bool> func)
{
foreach (int item in items)
{
if (func(item))
{
yield return item;
}
}
}