C# Linq 基础新

发布时间 2023-08-28 10:49:47作者: 不争丶
一、(复习)委托    转   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);
 }