C# Linq 基础新
一、(复习)委托 转 C# 委托、事件
二、自己实现Where
Single static void Main(string[] args)
{
int[] nums = new int[] { 3, 5, 3453, 33, 65, 1 };
IEnumerable<int> result1 = nums.Where(a => a > 10);
//等价于
IEnumerable<int> result = MyWhere(nums, a => a > 10);
foreach (var item in result)
{
Console.WriteLine(item);
}
}
static IEnumerable<int> MyWhere(IEnumerable<int> items,Func<int,bool> f)
{
List<int> result = new List<int>();
foreach (var i in items)
{
if (f(i)==true)
{
result.Add(i);
}
}
return result;
}
三、常见扩展方法
1、IEnumerable<T> 扩展方法
数组、List、Dictionary、Set....
补:
.Count(e=>e.Age>90) 返回数量
.Any(e=>e>Age>20) 返回是否至少有一条满足(性能高点)
2、获取一条数据(是否带参数的两种写法)
Single、 SingleOrDefault、First、FirstOrDefault
IEnumerable<People> itmes= list.Where(e => e.name == "xw");
People p = itmes.Single();
var el = list.Where(e => e.name == "xw").Single();
var e2 = list.Single(e => e.Age == 15);//有且只有一条满足要求的数据,不满足报错
var e3=list.SingleOrDefault(e => e.Age == 11);//一个都没有 返回null
int[] nums = new int[] { 3, 6, 7 };
int i = nums.SingleOrDefault(i => i > 7);//一个都没有 返回默认值0
var e4 = list.First(e => e.Age > 16);//至少有一条,返回第一条
var e5 = list.FirstOrDefault(e => e.Age > 1116);//一个都没有 返回null
3、排序
OrderBy、OrderByDescending、ThenBy
IEnumerable<People> itmes2 = list.OrderBy(e => e.Age);//从小到大排序
IEnumerable<People> itmes3 = list.OrderByDescending(e => e.Age);//从大到小排序
int[] nums = new int[] { 3, 41, 13, 15 };
IEnumerable<int> nums2 = nums.OrderBy(i => i);
//随机排序
Random rand = new Random();
var item4 = list.OrderByDescending(e => rand.Next());
//根据名字最后一个字符排序
var item5 = list.OrderByDescending(e =>e.name[e.name.Length-1]);
//排序再加条件(多规则排序)
var item6 = list.OrderBy(e => e.Age).ThenBy(e => e.Salary);
foreach (var e in item6)
{
Console.WriteLine(e);
}
指定某行排序位置
List<T> list = new List<T>();
T itemToMove = ...; // 假设要移动的元素
// 检查元素是否在 List 中
if (list.Contains(itemToMove))
{
// 根据条件排序,将元素移动到第一条位置
list = list.OrderBy(x => x.Equals(itemToMove) ? 0 : 1).ToList();
}
4、限制结果集,获取部分数据 (分页)
Skip(n)、Take(n)
//Skip跳过3条数据,Take取2条数据
var items = list.Skip(3).Take(2);
foreach (var e in items)
{
Console.WriteLine(e);
}
5、聚合函数
Max()、Min()、Average()、Sum()、Count()
6、分组!!
GroupBy()
返回值为IEnumerable<IGrouping<TKey, TSource>>类型的泛型IEnumerable。IGrouping中Key属性表示这一组的分组数组的值。[(key,e)]
//select age,max(salary) from t group by age
IEnumerable<IGrouping<int,People>> items = list.GroupBy(e => e.Age);
foreach (var e in items)
{
Console.WriteLine(e.Key);
Console.WriteLine("最大工资:"+e.Max(e=>e.Salary));
foreach (People g in e)
{
Console.WriteLine(g);
}
Console.WriteLine("******");
}
7、投影 和 SQL中 Select 差不多
Select()
var items1 = list.Where(e => e.Salary > 10000).Select(e => e.Age > 18 ? "成年" : "未成年");
foreach (var i in items1)
{
Console.WriteLine(i);
}
8、匿名类型 Var new{}
People p = new People() { name = "xw", Age = 19 };
var obj1 = new { name = "www", age = 88 };
Console.WriteLine(obj1.name);
Console.WriteLine(obj1.age);
//var 匿名类型!
var items1= list.Select(e => new { xingming = e.name, nianling = e.Age });
foreach (var i in items1)
{
Console.WriteLine(i.xingming+i.nianling);
}
9、去重
.GroupBy(t => new { t.personids, t.content }).Select(y => y.FirstOrDefault()).GroupBy(t => t.personids);
总:
1、
var items2 = list.GroupBy(e => e.Age).Select(g => new { ninaling = g.Key, MaxS = g.Max(e => e.Salary), MinS = g.Min(e=>e.Salary), RenShu=g.Count()});
foreach (var e in items2)CC
{
Console.WriteLine(e.ninaling+","+e.MaxS+","+e.MinS+","+e.RenShu);
}
2、


2、自定义扩展方法
(1) WhereIf
1 . conditions: 这是一个表示条件的布尔值。如果条件为真(true),则 Where 过滤会被应用;如果条件为假(false),则 Where 过滤会被跳过。
2 .expression: 这是一个表示过滤条件的函数或表达式。如果条件为真,即 conditions为真,那么 predicate 表达式就会被应用于查询。
四、查询语法(SQL)
五、解决面试题
1、


2、

string s = "hello World,Hahah,heiheihei";
//char.IsLetter取字符串中的字母 char.ToLower转小写
var items = s.Where(c => char.IsLetter(c)).Select(c => char.ToLower(c)).GroupBy(c => c).Select(g => new { g.Key, Count = g.Count() }).OrderByDescending(g => g.Count).Where(g => g.Count > 2);
foreach (var item in items)
{
Console.WriteLine(item);
}