首页 > 代码库 > 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表达式的表示方式和表示意义。