基本规则:
LINQ 数据源是支持泛型 IEnumerable 接口或从中继承的接口的任意对象。
数据源处理为可查询类型
1.XML文件转可查询类型(XElement 类型)
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
2.DataTable转可查询类型
dataTable.AsEnumerable()
应用
.SelectMany/.GroupBy(.Key .Count)/.Where/.Select/.OrderBy/.ToList
DataTable:计数出现的值及数量
List<BIN> list = dataTable.AsEnumerable()
.SelectMany(row => row.ItemArray.Select(col => col.ToString()))
.GroupBy(item => item)
.Where(item => item.Key != empty)
.Select(item => new Bin { BIN_ID = item.Key.ToString(), QTY = item.Count().ToString() })
.OrderBy(item => item.BIN_ID)
.ToList();
1 DataTable .SelectMany 先取DataRow 说明:这里用SelectMany是因为要用row中每列的值(多个值),如果是只取row中的一个值 eg. row列为Name的值 则使用Select。
2 说明:DataRow 类的 ItemArray 属性。该属性返回一个 object[] 数组,其中包含了该 DataRow 所有列的值
object[] .Select 获取列值 =>作为SelectMany的结果
3 .GroupBy 根据item值分组 说明:这里的作用是为了分出来item.Key和item.Count()
4 .Where 筛选条件 item.Key不为empty
5 .Select 将每一个item 转成对象BIN
5 .OrderBy 根据item.BIN_ID 排序(这里已经是对象了)
6 .ToList() 收集成list
.GroupBy/.Select/.First()/.ToList
获取List的其中一个属性 并对该属性去重
List< CUST_NO > list = list2.GroupBy(x => x.NO)
.Select(g => g.First())
.ToList();
List<string> editTypeList =list2.Select(x => x.NO).ToList();
//List< CUST_NO > list2
1 .GroupBy(x => x.NO)根据PSNO 将list元素每个 CUST_NO 对象分组
2 .Select(g => g.First()) 只获取每个分组里第一个对象
3 .收集为list
.Count
计算字符串中字符char出现的次数
int count = input.Count(c => c == ',');
//string input
//当满足字符条件时计数
.OrderByDescending/.First() &.FirstOrDefault()
对list的某一属性进行倒序排序,并取第一个值
list.OrderByDescending(item => item.Timestamp).FirstOrDefault();
FirstOrDefault vs First
行为:返回序列中的第一个元素
异常处理:
.First() 对空序列使用会抛出异常。
.FirstOrDefault() 对空序列使用返回默认值。(引用类型默认值为null)