阅读目录

  • 1、GroupBy与group by
  • 2、Where条件筛选。
  • 3、Select(取list中的id列数据,并按逗号分隔成字符串。例:1,2,3,4,5)
  • 4、Where与Select的同时使用,取list中的id列数据,并按逗号分隔成字符串。
  • 5、左联与内联(例子是DataTable类型)
  • 6、OrderBy排序
  • 7、OrderBy随机排序
  • 8、Skip,Take分页(LINQ:使用Take和Skip实现分页)
  • 9、Distinct去重

获取数据列表。

//获取数据列表,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 mselect 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 mselect 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
}

2、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 listwhere ("," + projectmodel.ids + ",").Contains("," + item.id + ",")select item).ToList<Model>();

3、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()立即执行

4、Where与Select的同时使用,取list中的id列数据,并按逗号分隔成字符串。

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);

5、左联与内联(例子是DataTable类型)

//dt,dt1,dt2都为DataTable类型。
//左联比内联,需要多写into,需要多写from gc1 in corr.DefaultIfEmpty(),需要多写corr=gc1。
//当on为单条件时。
var results = from student in dt.AsEnumerable()join user in dt1.AsEnumerable() on student.Field<int>("student_id") equals user.Field<int>("id")//内联join corr in dt2.AsEnumerable() on student.Field<int>("id") equals corr.Field<int?>("studentproject_id") into corr//左联from gc1 in corr.DefaultIfEmpty()select new{student,user,corr = gc1};//当on为多条件时,借助于匿名类型:其实和解决按多条件分组的思路是一样的。
var results = from student in dt.AsEnumerable()join zrs in result_zrs on new { districtcounty = student.Field<string>("districtcounty"), school = student.Field<string>("school") }equals new { districtcounty = zrs.districtcounty, school = zrs.school } into zrsfrom gc1 in zrs.DefaultIfEmpty()select new{student,corr = gc1};//取值方式
foreach (var i in results.ToList())
{name = i.user.Field<string>("name");
}

6、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

7、OrderBy随机排序

//方式一
Random rd = new Random();List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr.Add("111");
liststr.Add("222");
liststr.Add("333");
//随机一个
var s = liststr.OrderBy(_ => Guid.NewGuid()).First();
//随机两个
var ss = liststr.OrderBy(_ => Guid.NewGuid()).Take(2);
//乱序
var sss = liststr.OrderBy(o => rd.Next(0, liststr.Count())).ToList();

//方式二
Random rd = new Random();
list.OrderBy(_=>rd.Next(1,99)).First();
//随机排序通用方法
//就是从原List中每次随机取一项,添加到新的List中,并在原List中删除。这样重复,直到原List为空为止。
//不过要注意,如果要保护原List不受变化,就必须先Copy一份List,再在Copy上进行操作
public static List<T> GetRandomList<T>(List<T> inputList)
{//Copy to a arrayT[] copyArray = new T[inputList.Count];inputList.CopyTo(copyArray);//Add rangeList<T> copyList = new List<T>();copyList.AddRange(copyArray);//Set outputList and randomList<T> outputList = new List<T>();Random rd = new Random(DateTime.Now.Millisecond);while (copyList.Count > 0){//Select an index and itemint rdIndex = rd.Next(0, copyList.Count - 1);T remove = copyList[rdIndex];//remove it from copyList and add it to output
        copyList.Remove(remove);outputList.Add(remove);}return outputList;
}

8、Skip,Take分页(LINQ:使用Take和Skip实现分页)

//Skip是起始数据,表示从第n+1条数据开始.(此处pageNum应从0开始)
//pageNum:页数、=0是第一页,pageSize:一页多少条
list = list.Skip(pageNum * pageSize).Take(pageSize).ToList();
//取前1-10条
list = list.Skip(0).Take(10).ToList();
//也可以这么写取前1-10条
list = list.Take(10).ToList();
//取第11-20条
list = list.Skip(10).Take(10).ToList();

9、Distinct去重

//字符串数组
string[] idlist =  new string[ ]{"aaa","bbb","aaa"};
//去除重复aaa
idlist = idlist.Distinct().ToArray();

转载于:https://www.cnblogs.com/kliine/p/9177717.html

C# Linq处理list数据相关推荐

  1. 基于Visual Studio2010讲解LINQ读出数据库数据生成XML

    LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML.  LINQ to XML 最重要的优势是它与 Lang ...

  2. 使用Linq判断DataTable数据是否重复

    我们一般系统在导入数据的时候,一般都是通过NPOI将excel数据转换成DataTable,然后将DataTable导入到数据库.在数据导入的过程中,其实很重要的一部就是检查DataTable中的数据 ...

  3. 光脚丫学LINQ(005):数据表之间的联接查询

    视频演示:http://u.115.com/file/f29a440f67 联接运算创建数据源中没有显式建模的序列之间的关联.例如,您可以执行联接来查找符合以下条件的所有客户:位于巴黎,且从位于伦敦的 ...

  4. Linq 读取Xml 数据

    1.xml 数据格式如下 1 <?xml version="1.0" encoding="utf-8"?> 2 <root> 3 < ...

  5. Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法System.String ToString()问题解决)...

    var items = from c in contacts select new ListItem { Value = SqlFunctions.StringConvert((double)c.Co ...

  6. LINQ篇:ASP.NET using LINQ(Part One) Scott大师的产物

    [原文地址]Using LINQ with ASP.NET (Part 1) [原文发表日期]Sunday, May 14, 2006 9:49 PM 最近使我激动不已的新鲜事之一就是LINQ系列技术 ...

  7. ScottGu之博客翻译-LINQ to SQL第三部分,查询数据库 (Part 3 - Querying our Database)

     本贴只为共享知识,更为简洁(即无英文的版本)将会发布在博客堂上,堂主正对此文进行审阅. 希望本贴能对您的LINQ to SQL语言的学习有一定的帮助! 原贴链接: http://weblogs.as ...

  8. Linq的简介和基础知识学习

    学习LINQ之前,我们要知道LINQ是干什么,解决什么问题的,怎样学习? 一.LINQ简介 1.什么是LINQ? 什么是LINQ?LINQ中文翻译为语言集成查询(Language Integrated ...

  9. ScottGu之博客翻译-LINQ to SQL第四部分,更新数据库 LINQ to SQL (Part 4 - Updating our Database)...

    原贴链接: http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.asp ...

  10. Linq查询datatable的记录集合

    通过linq查询datatable数据集合满足条件的数据集 1.首先定义查询字段的变量,比方深度 string strDepth=查询深度的值: var dataRows = from datarow ...

最新文章

  1. redis学习 -- 简单动态字符串
  2. 人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码
  3. 求生之路 l4d linux,求生之路开服过程(基于ubuntu)
  4. Qt之QSlider
  5. 【不会吧不会吧,不会有人真的三分钟入门Python了吧?】Python编程基础
  6. css设置title字体_CSS中简写属性要注意TRouBLe的顺序,避免踩坑
  7. 内网集群 无法通信_记一次集群内无可用http服务问题排查
  8. 项目管理理论与实践系列文章索引
  9. [零基础学JAVA]Java SE应用部分-35.JAVA类集之四
  10. Eclipse ADT插件和主题
  11. resourcehacker汉化版教程
  12. Android 热修复Bugly和Sophix介绍
  13. 把自然语言文本转换为向量 | NLP基础
  14. WEB安全之:Mysql 数据库 SQL 注入(三)
  15. Steam推出多人联机本地游戏功能 即将推出
  16. 微信没有回车键怎么换行_微信打字怎么换行
  17. 学计算机要高智商吗,这7大高智商专业,很容易挂科,如果不是学霸级人物,最好不要报考...
  18. 关于 TFT 、 TFD 、 UFB 、 STN 、 DSTN 和 OLED
  19. 解决springboot无法访问此网站,springboot启动后无法访问网站
  20. Python学习之道-串口编程TEMI880温箱控制

热门文章

  1. Unable to update index for central|http://repo1.maven.org/maven2
  2. HDU2066--一个人的旅行(Dijkstra)
  3. Jquery—对$()的总结
  4. 深入学习Java中的字符串,代码点和代码单元
  5. GDAL被java调用 Cannot find proj.db
  6. 48. 总是包含(#include)正确的头文件
  7. 一些简单的git命令及操作
  8. 华为p50 pro 鸿蒙,华为P50Pro真豪横!鸿蒙系统+真全屏5摄,网友:太香了!
  9. 浏览器打印设置横向打印_hp打印机共享怎么设置 hp打印机共享设置方法【详解步骤】...
  10. java 泛型 basedao_java的SSH的baseDao,巧用泛型