C# Linq集合

Linq处理list数据

//获取数据列表,Model是类
IList<Model> list = dao.getmx(Model, pageInfo);
//DataTable数据
DataTable dt = ......;
  1. GroupBy与group by
//GroupBy
//单条件,并返回序列中满足指定条件的第一个元素(相当于list按照user_type去重,可以是多条).
list = list.GroupBy(a => a.user_type).Select(it => it.First()).ToList();

//多条件,使用了匿名函数.
var quary = list.Where(a => a.p_num == "1" || a.c_num == "1")
            .GroupBy(a => new { student_id = a.student_id, user_type = a.user_type })
            .Select(group => new
            {
                student_id = group.Key.student_id,
                user_type = group.Key.user_type,
                Count = group.Count()
            });

//group by
//单条件
var quary = from a in list.Where(a => "1,8".Contains(a.user_type))
            group a by new { a.school } into m
            select new
            {
                school = m.Key.school
            };

//多条件
var quary = from a in list.Where(a => "1,8".Contains(a.user_type))
            group a by new { a.provice, a.school } into m
            select new
            {
                provice = m.Key.provice,
                school = m.Key.school
            };

//quary取值方法,此处可写可不写ToList()。  //经过测试,数据30W,无ToList()比ToList()的耗时少几百毫秒,具体原因未知。下面是实验的几组数据:第一次9689 9398,第二次13529 10458,第三次10772 10392,第四次11370 10833。实际差距并不大。
foreach (var item in quary.ToList())
{
    //取值item
}
  1. Where条件筛选。
//将provice=吉林的筛选出来。
list = list.Where(x => x.provice == "吉林").ToList();

//将包含1,5条件的数据筛选出来,相当于sql里的in用法:select * from 表 where user_type in (1,5)
list= list.Where(a => "1,5".Contains(a.user_type)).ToList();

//此处等同于上面
list= list.Where(a => a.user_type == "1" || a.user_type == "5").ToList();

//另一种形式,from开头
IList<Model> query = (from item in list
                      where ("," + projectmodel.ids + ",").Contains("," + item.id + ",")
                      select item).ToList<Model>();
  1. Select(取list中的id列数据,并按逗号分隔成字符串。例:1,2,3,4,5)
//方式一
//分成key-value的数组
string[] id = list.Select(a => a.id.ToString()).ToArray();
//dt是datatable类型的,执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
string[] id = dt.AsEnumerable().Select(a => a.Field<int>("id").ToString()).ToArray();
//将数组变成1,2,3,4,5的字符串
string ids = string.Join(",", id);

//方式二
//效果等同于foreach循环
foreach (var i in list)
{
    ids += i.id + ",";
}
ids = ids.TrimEnd(',');

上述代码使用LINQ 针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ的查询操作。

.AsEnumerable()与相对应的.AsQueryable()的区别:
1) AsEnumerable()是 LINQ TO OBJECT,AsQueryable()是 LINQ TO SQL
2) AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
3) AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。
4) .ToList()立即执行
  1. Where与Select的同时使用,取list中的id列数据,并按逗号分隔成字符串。
//方式一
//分成key-value的数组
string[] id = list.Select(a => a.id.ToString()).ToArray();
//dt是datatable类型的,执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
string[] id = dt.AsEnumerable().Select(a => a.Field<int>("id").ToString()).ToArray();
//将数组变成1,2,3,4,5的字符串
string ids = string.Join(",", id);

//方式二
//效果等同于foreach循环
foreach (var i in list)
{
    ids += i.id + ",";
}
ids = ids.TrimEnd(',');

上述代码使用LINQ 针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ的查询操作。

.AsEnumerable()与相对应的.AsQueryable()的区别:
1) AsEnumerable()是 LINQ TO OBJECT,AsQueryable()是 LINQ TO SQL
2) AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
3) AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。
4) .ToList()立即执行
  1. 左联与内联(例子是DataTable类型)
string[] id = list.Where(a => !string.IsNullOrEmpty(a.user_type)).Select(a => a.id).ToArray();
//ids="1,2,3,4,5,6,7";
string ids = string.Join(",", id);
  1. OrderBy排序
//1个排序
list.OrderBy(a => a.student_id);
//2个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name);
//多个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name).ThenBy(a => a.sex);
//参数排序
List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr = liststr.OrderBy(a => a).ToList();//aaa bbb ccc
liststr = liststr.OrderBy(a => a == "bbb" ? "1" : a == "ccc" ? "2" : "3").ToList();//bbb ccc aaa
  1. OrderBy随机排序
//1个排序
list.OrderBy(a => a.student_id);
//2个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name);
//多个排序
list.OrderBy(a => a.student_id).ThenBy(a => a.name).ThenBy(a => a.sex);
//参数排序
List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr = liststr.OrderBy(a => a).ToList();//aaa bbb ccc
liststr = liststr.OrderBy(a => a == "bbb" ? "1" : a == "ccc" ? "2" : "3").ToList();//bbb ccc aaa
  1. Skip,Take分页(LINQ:使用Take和Skip实现分页)

  1. Distinct去重

1.Skip和Take的用法

Skip()和Take()方法都是IEnumerable 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串都可以调用这两个方法。

var testList = new List();
//比如 testList里面是 1,2,3,4,5,6,7,8,9,10
var result = testList.Skip(5); //返回值就是 6,7,8,9,10;
var result = testList.Take(5); //返回值就是 1,2,3,4,5
//搭配使用,一般用来分页
var result = list.Skip(2).Take(2); //返回值 3,4

C#编程之IList、List、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值