C# Linq的基础使用

1、基础方法

Where()方法:方法中使用匿名方法过滤符合条件的数据。

Count()方法:获取数据条数。

Any()方法:是否至少有一条数据满足条件。

Single()方法:有且只有一条满足要求的数据,如果没有或者超过一条都会报异常。

SingleOrDefault()方法:最多只有一条满足要求的数据,如果没有就返回null,如果超过一条就会报异常。

First()方法:返回第一条。如果一条都没有,会报异常;如果有多条则返回第一条。FirstOrDefault()方法:返回第一条或默认值。如果一条都没有返回默认值,如果有多条返回第一条

Skip(n)方法:跳过n条数据。

Take(n)方法:获取n条数据。

    //声明一个学生成绩类
    public class ScoreInfo
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Subject { get; set; }
        public string Sex { get; set; }
        public int Score { get; set; }
    }

static void Main(string[] args){


    //初始一些值
    List<ScoreInfo> scoreList = new List<ScoreInfo>()
    {
        new ScoreInfo(){ Id=1, Name="张三", Score=98, Subject="语文", Sex="男"  },
        new ScoreInfo(){ Id=2, Name="李四", Score=90, Subject="数学", Sex="男"  },
        new ScoreInfo(){ Id=3, Name="王五", Score=88, Subject="语文", Sex="女"  },
        new ScoreInfo(){ Id=4, Name="赵柳", Score=95, Subject="英语", Sex="女"  },
        new ScoreInfo(){ Id=5, Name="李佳", Score=60, Subject="语文", Sex="男"  },
        new ScoreInfo(){ Id=6, Name="柳公权", Score=70, Subject="数学", Sex="女"  },
        new ScoreInfo(){ Id=7, Name="柳先开", Score=45, Subject="数学", Sex="女"  },
        new ScoreInfo(){ Id=8, Name="论文集", Score=45, Subject="数学", Sex="男"  }
    };

    List<Student> studentList = new List<Student>()
    {
        new Student(){Id = 1,Name="张三" },
        new Student(){Id = 2,Name="王五" },
        new Student(){Id = 3,Name="柳先开" }
    };

    //获取成绩大于80的数据
    var whereList = scoreList.Where(c => c.Score > 80);
    //成绩及格的条数
    var count = scoreList.Where(c => c.Score > 60).Count();
    //是否包含 返回结果true
    var anyRet = scoreList.Any(c => c.Name == "柳先开");
    //获取一条数据
    var single = scoreList.Single(c => c.Id == 1);
    var singleDef = scoreList.SingleOrDefault(c => c.Id == 1);
    //获取集合中的首条数据
    var firstList = scoreList.First(c => c.Subject == "数学");
    var firstListDef = scoreList.First(c => c.Subject == "数学");

    //集合的高级用法
    //成绩信息与学生信息的交集 根据姓名过滤。会找出Id为1、3、7的值。
    var unionList = scoreList.Where(c => studentList.Any(s => s.Name == c.Name)).ToList();
    //如果要找出不在集合studentList中的值则是一下写法。会找出Id为2、4、5、6的值。实际项目的应用场景,在批量插入数据时,去重数据库中存在的数据。
    var noList = scoreList.Where(c => !studentList.Any(s => s.Name == c.Name)).ToList();
   
}

2、排序用法

OrderBy()方法:对数据正序排序。

ThenBy()方法:实现次要字段正序排序。

OrderByDescending()方法:对数据倒序排序。

ThenByDescending()方法:实现次要字段降序排序。

//根据成绩正序排序
var orderby = scoreList.OrderBy(c => c.Score).ToList();
//先根据成绩正序排序 再根据性别正序排序
var orderthen = scoreList.OrderBy(c => c.Score).ThenBy(c => c.Sex).ToList();
//根据成绩倒序排序
var orderbyDes = scoreList.OrderByDescending(c => c.Score).ToList();
//先根据成绩正序排序 再根据性别倒序排序
var orderbyDesthen = scoreList.OrderBy(c => c.Score).ThenByDescending(c => c.Sex).ToList();

3、聚合函数、分组

Max():获取最大值。

Min():获取最小值。

Average():获取平均值。

int max = scoreList.Max(c => c.Score); //结果:98
int mit = scoreList.Min(c => c.Score); //结果:45
double avg = scoreList.Average(c => c.Score); //结果:73.875

GroupBy()方法:参数是分组条件表达式(c => c.Sex),多字段分组时的条件表达式(c => new { c.Id, c.Name })。返回值为IGrouping<TKey, TSource>类型的泛型IEnumerable,也就是每一组以一个IGrouping对象的形式返回。IGrouping是一个继承自IEnumerable的接口,IGrouping中key属性表示这一组的分组数据的值。

//根据成绩分组
IEnumerable<IGrouping<int, ScoreInfo>> scoreInfos = scoreList.GroupBy(c =>c.Score);
foreach (IGrouping<int, ScoreInfo> group in scoreInfos)
{
    Console.WriteLine(group.Key);//分组的字段值Key
    foreach (var item in group)
    {
        Console.WriteLine("Id:"+item.Id.ToString() +",Name:"+ item.Name +",Score:"+ item.Score.ToString());
    }
    Console.WriteLine("-------------------------");
    Console.WriteLine();
}

//多个字段分组
var scores = scoreList.GroupBy(c => new { c.Score,c.Sex });

输出结果:

分组的其它用法:

//根据成绩排序,再根据性别成绩分组,取出分组中的第一条数据。
var groupFirst = scoreList.OrderByDescending(c => c.Score).GroupBy(c => new { c.Sex, c.Score }, (key, group) => group.First()).ToList();

//根据成绩分组之后,再投影成一个新集合
var ret = groupFirst.GroupBy(c => c.Score, (key, group) => group.Select(s => new { s.Id, s.Name, s.Score })).ToList();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值