首页 > 代码库 > C#标准查询运算(Linq)
C#标准查询运算(Linq)
1.标准查询符
在C#3.0之后微软对集合进行了非常大的改造,使用了查询符进行集合的查询,这一切都来自.NetFramework 对Lambda表达式的支持。标准查询符,一共有两种类型是支持泛型和不支持泛型的,因为引入泛型的目的在于写出公用的代码,避免代码累赘。
注意,除非赋值给变量的类型是一眼就能看出来的,否则就应该只有在声明类型的时候指定隐式类型的变量(var)。
在System.Linq.Enumerable命名空间下面有很多的标准出阿仙奴符号,通过这些查询符号可以减少程序中重复写for循环或者嵌套的for循环。
Where(),“垂直”方向的筛选一个集合(减少集合中项目的数量)。
Select(),"水平"方向缩减集合的规模(减少列的数量)。
以上两个查询符号分别在where或select后面添加上查询的达标条件,而且这种条件以lambda表达式进行书写。
Count(),计算集合条数。
Any(),尝试遍历集合中的一个项,返回true或false
OrderBy(),ThenBy(),表示首先按照OrderBy里面的条件进行排序,然后再依据ThenBy进行排序,可以有多个ThenBy函数.r如下:我们排序一个parents集合,首先按照YearOfPublication 排序然后按照Title进行排序。
IEnumerable<Parent> items; parent[] parents = PatentData.Parents; items=parents.OrderBy(p=>p.YearOfPublication).ThenBy(p=>p.Title);
2.联接操作(Join)
SQL语句里面的Join是用来连接多个表进行连接查询的语句,在.Net里面的Join是用来连接多个集合进行查询的语句。这两个都有异曲同工之妙。这就使用了求两个集合的交集
public class Department{ //定义部门子对象 public long Id{get;set} public string Name{get;set;} } public class Employee{ //定义用户之对象,包含Department的主键id public int Id{get;set;} public string name{get;set;} public int DepartmentId{get;set;} //Department的主键id } //目前有两个集合一个是Department集合和Employee集合,通过employee集合找到对应的Department内容 static void main(){ var items=employee.Join( department, e=>e.DepartmentId, d=>d.Id, (e,d)=>new{ e.Id,e.name } ); //然后输出Items内容 }比如使用Join求两个集合的交集,但是这是两个类型,通过两个集合中共有字段Piority和CustomCallerID具体使用方法,下面是可能使用到的类。 var list = cc.Join(ccmms, //join(),第一参数是inner,指定ccmms和cc要链接到的目标集合。 s1 => new KeyTemp { Piority = s1.Priority, CustomCallerID = s1.CustomerCallerID }, //本句和下面一句表明他们是通过那两个键进行求交集的 s2 => new KeyTemp { Piority = s2.Priority, CustomCallerID = s2.CustomerCallerID }, (s1, s2) => s1, new KeyTemp()).ToList(); --定义一个类,用于完成这样的查询。上面是使用方法。 public class KeyTemp:IEqualityComparer<KeyTemp> { public int Piority //定义类中的属性 { get; set; } public int CustomCallerID //定义类中的属性 { get; set; } #region IEqualityComparer<KeyTemp> 成员 public bool Equals(KeyTemp x, KeyTemp y) //调用Equals完成比较,找到相同的数据 { return (x.CustomCallerID == y.CustomCallerID) && (x.Piority == y.Piority); //重写对象中判断两个对象是否相等的方法 } public int GetHashCode(KeyTemp obj) { return (obj.Piority << 15) | (obj.CustomCallerID); //1; //返回一个固定值。 } #endregion }
3.高级查询,两个和更多集合进行查询
GroupBy(),根据指定依据进行分组。
GroupJoin(),实现外部分组连接。
SelectMany()与Select()区别,Select()获得最后是一个数组,SelectMany()会把获得的整合成为一个集合。
OfType<T>,够着查询一个集合,只返回特定的数据类型,如list.OfType<int>()
Union(),合并两个集合,不包含重复的项。
Concat(),合并两个集合,包括重复项。
Intersect(),求交集
Distinct(),去掉重复项。
SequenceEquals(),比较连个集合,返回连个集合是否一样。
Reverse(),翻转集合。
4.聚合函数
Count(),集合项数。
Average(),数值集合平均数。
Sum(),数值集合求和。
Max(),数值集合最大值。
Min()数值集合最小值。
int[] a = { 1, 2, 3, 4, 5, 6, 7 }; int[] b = { 4, 5, 6, 7, 8, 9, 10 }; int[] c = { 1, 2, 3, 3, 4, 1, 2, 4, 6, 1, 6, 5 }; // 交集 var fuck = a.Intersect(b); // 并集 var shit = a.Union(b); // a有b没有的 var diff1 = a.Except(b); // b有a没有的 var diff2 = b.Except(a); var max = a.Max(); var min = a.Min(); var avg = a.Average(); var dis = c.Distinct();
这些是常用的标准查询符Linq,使用Linq可以更加方便的进行集合的操作,Linq是建立在Lambda表达式基础上,如果要把Linq熟练掌握,需要很好的理解lambda表达式的表示方式和表示意义。