C# Linq处理list数据
获取数据列表。
//获取数据列表,Model是类
IList<Model> list = dao.getmx(Model, pageInfo);
//DataTable数据
DataTable dt = ......;
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 == "" || a.c_num == "")
.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
}
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 == "" || a.user_type == "").ToList(); //另一种形式,from开头
IList<Model> query = (from item in list
where ("," + projectmodel.ids + ",").Contains("," + item.id + ",")
select item).ToList<Model>();
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()立即执行
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);
左联与内联(例子是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 zrs
from gc1 in zrs.DefaultIfEmpty()
select new
{
student,
corr = gc1
}; //取值方式
foreach (var i in results.ToList())
{
name = i.user.Field<string>("name");
}
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
OrderBy随机排序
//方式一
Random rd = new Random(); List<string> liststr = new List<string>();
liststr.Add("aaa");
liststr.Add("bbb");
liststr.Add("ccc");
liststr.Add("");
liststr.Add("");
liststr.Add("");
//随机一个
var s = liststr.OrderBy(_ => Guid.NewGuid()).First();
//随机两个
var ss = liststr.OrderBy(_ => Guid.NewGuid()).Take();
//乱序
var sss = liststr.OrderBy(o => rd.Next(, liststr.Count())).ToList();
//方式二
Random rd = new Random();
list.OrderBy(_=>rd.Next(,)).First();
//随机排序通用方法
//就是从原List中每次随机取一项,添加到新的List中,并在原List中删除。这样重复,直到原List为空为止。
//不过要注意,如果要保护原List不受变化,就必须先Copy一份List,再在Copy上进行操作
public static List<T> GetRandomList<T>(List<T> inputList)
{
//Copy to a array
T[] copyArray = new T[inputList.Count];
inputList.CopyTo(copyArray); //Add range
List<T> copyList = new List<T>();
copyList.AddRange(copyArray); //Set outputList and random
List<T> outputList = new List<T>();
Random rd = new Random(DateTime.Now.Millisecond); while (copyList.Count > )
{
//Select an index and item
int rdIndex = rd.Next(, copyList.Count - );
T remove = copyList[rdIndex]; //remove it from copyList and add it to output
copyList.Remove(remove);
outputList.Add(remove);
}
return outputList;
}
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().Take().ToList();
//也可以这么写取前1-10条
list = list.Take().ToList();
//取第11-20条
list = list.Skip().Take().ToList();
Distinct去重
//字符串数组
string[] idlist = new string[ ]{"aaa","bbb","aaa"};
//去除重复aaa
idlist = idlist.Distinct().ToArray();
相关文章:.NET/C# 优化心得
C# Linq处理list数据的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
- linq根据传入数据集合查询对应子级数据
工作中经常用到的linq根据传入数据集合查询对应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点对应ID数据集合,再根据ID数据集合查询全部子级数据. //获取缓存数据 ...
- linq依据传入数据集合查询相应子级数据
工作中经经常使用到的linq依据传入数据集合查询相应子级数据,整理共享,希望大家都能用得上,代码中doublesArray 为父节点相应ID数据集合,再依据ID数据集合查询所有子级数据. //获取缓存 ...
- LINQ和.NET数据访问
.NET数据访问 在.NET中对于数据的访问大致有三个层面,数据访问层.内存数据集.业务逻辑层.数据层,包括了XML配置文件以及一些常用的数据库(使用SQL语句):内存数据集,主要是DataSet数据 ...
- mvc+linq+EF对数据表的查删改
/// <summary> /// 查询数据库中学生姓名 /// </summary> /// <returns></returns> public A ...
- Linq 处理 List数据
概述:LINQ又称为语言集成查询,是一种类似于SQL的一种查询语言.语言集成查询让开发人员可以使用.NET程序语言(如C#)去查询数据源,主要数据源为内存中的集合对象.ADO.NET数据集.数据库以及 ...
- Linq处理list数据
获取数据列表. //获取数据列表,Model是类 IList<Model> list = dao.getmx(Model, pageInfo);//DataTable数据DataTable ...
- Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)
1.在工作中碰到这样一个问题: 使用linq时,需要查询两个表,在这两张表中关联字段分别是int,和varchar()也就是string,在linq中对这两个字段进行关联, 如果强制类型转换两个不同类 ...
- 通过Linq查找重复数据
一.模拟初始化集合数据 List<Student> students = new List<Student>() { new Student(){ Age=18,Name=&q ...
随机推荐
- PLC300寻址指令
1.寻址图解 2.直接寻址 直接寻址包括两大类,绝对地址寻址和符号地址寻址 绝对地址:由一个标识符和存储器位置组成. 例如:I 0.0 Q 1.7 PIW 256 PQW 512 MD 20 T 15 ...
- JS_高程3.基本概念(1)
1.语法 (1)ECMAScript中的一切(变量,函数名和操作符)都是区分大小写的. (2)标识符 标识符的第一个字符必须是字母,下划线或是美元符号. 其他字符可以是字母,下划线,美元符号和数字. ...
- px2rem
vue做移动端适配,借助px2rem 插件方便的将px单位转为了rem 1.安装 npm install px2rem-loader lib-flexible --save 2.在项目入口文件mai ...
- python接口自动化29-requests-html支持JavaScript渲染页面
前言 requests虽好,但有个遗憾,它无法加载JavaScript,当访问一个url地址的时候,不能像selenium一样渲染整个html页面出来. requests-html终于可以支持Java ...
- html提交表单到Servlet
源码地址 https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Form 演示效果(注意post与get提交方式浏览器地址 ...
- Unity 5.4版本 Application.systemLanguage 失效
最近在上线双语版本(一个包支持中文.英文二种语言)时,遇到一个坑点 if (ToolUtils.isAndroid()) { if (Application.systemLanguage == Sys ...
- 最课程阶段大作业06:U度节能平台控制系统
除了互联网项目,当今社会还有一个概念非常流行,那就是:物联网.什么是物联网?物联网是通过传感设备,按约定的协议,把任意物品与互联网相连接,进行信息交换和通信,以实现智能化识别.定位.跟踪.监控和管理的 ...
- 自动化运维之PSSH
1.PSSH简介 PSSH提供OpenSSH和相关工具的并行版本.包括pssh,pscp,prsync,pnuke和pslurp.该项目包括psshlib,可以在自定义应用程序中使用. pssh是py ...
- 读取PBOC电子现金指令流
该指令流仅适用于T=0协议卡片. 终端对IC卡的响应: 60 须要额外的工作等待时间,说明IC卡端数据还未处理好. 61 发送GET RESPONSE命令取应答数据 6C 加上取字节数,命令重发 ...
- PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers
微擎出错信息: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2054] Server s ...