linq---我为你提笔序,你的美不只查询语句
来源:程序员人生 发布时间:2015-01-26 09:27:01 阅读次数:3228次
LinQ百度百科对她这样解释,是1组用于c#和Visual Basic语言的扩大。它允许编写C#或Visual Basic代码以查询数据库相同的方式操作内存数据。 LINQ是Language Integrated Query的简称,翻译成中文就是语言集成查询,它是集成在.NET编程语言中的1种特性。已成为编程语言的1个组成部份,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不单单只是外部数据源。她提供多种查询方法,有select,where,orderby,groupby,小火伴们是否是觉得在哪儿见过nie,哦,在梦里,开玩笑,跟我们之前学习过的sql相似,那末她们有甚么区分nie,接着小编举例说明。
比如,我们要实现从numbers数组中获得大于50的数,我们的代码是这么来写的:
<span style="font-size:18px;"><span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ch01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnTest_Click(object sender, EventArgs e)
{
int[] arr = { 123, 12, 3, 12, 15, 4, 6, 46, 48, 56, 785 };
//获得大于50的数
//没有LinQ我们怎样做?
ArrayList result = new ArrayList();
for (int i = 0; i < arr.Length;i++ )
{
if (arr[i]> 50)
{
result.Add(arr[i]);
}
}
//打印result就ok了
for (int i = 0;i<result.Count;i++)
{
Console.WriteLine(result[i]);
}
}
}
}
</span></span>
运行效果以下:
接着,我们来看,如果使用linq,我们的代码又该如何写nie:
<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ch01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnTest_Click(object sender, EventArgs e)
{
int[] arr = { 123, 12, 3, 12, 15, 4, 6, 46, 48, 56, 785 };
//有了LinQ后我们可以这么做
//获得大于50的数
IEnumerable ie = arr.Select(p => p).Where(p => p > 50);
//输出--该部份代码可重用
IEnumerator result = ie.GetEnumerator();
while (result.MoveNext())
{
Console.WriteLine(result.Current);
}
}
}
}
</span>
运行效果以下:
从上面的对照我们很容易可以看出,使用linq更加简洁,接下来,小编简单的介绍1下linq的扩大方法,那末甚么是扩大方法呢?扩大方法又是如何出现的呢? .net framework为编程人员提供了很多的类,很多的方法,但是,不论.net framework在类中为我们提供了多么多的方法,有时候依然不能满足我们的需求,例如:你想让字符串对象具有ToPascal方法,含义就是将字符串转化为Pascal格式,并返回,我们知道,.net framework提供的String类中并没有为我们提供相应的方法,此时,我们应当怎样做才可以到达我们的目的呢?有人说可以继承String类,这个不行,由于.net
framework提供的类都是finnal类,终究类,不能被继承,那末,怎样样才可以解决这个问题呢?此时,就出现了扩大方法。扩大方法有哪些好处呢? 为现有类提供1些额外的方法,这样做的好处就是,原有类不需要重新编译生成,只需要在程序中引入1些额外的dll就能够了,我们来看1个具体的例子。
比如说,我们有个字符串,当我们定义1个变量以后,比如说,我们给他1个值,在s字符串里面有1组方法,那末这组方法是系统帮我们定义好的,如果有天,我想要1个特殊的方法,比如topuuer转换成大写,tolower转换成小写,在接着,我想要首字母大写后面都小写,怎样办,这里面没有这类方法,怎样办nie,怎样去实现这类功能,这个就是我们扩大方法中要解决的问题,扩大方法的目标就是对现有的类提供额外的方法以增强该类的功能,我们可以这么来做,给他加1个扩大方法,首先,我们来做1个静态类,扩大方法是1种特殊的静态方法,我们怎样样来实现呢,以下:
<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ch01
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
private void btnExtraMethod_Click(object sender, EventArgs e)
{
//拓展方法,目标,对现有的类提供额外的方法以增强类的功能
string s = "asEdSadaDsdSsa";
Console.WriteLine(s.ToUpper());
Console.WriteLine(s.ToLower());
Console.WriteLine(s.ToPascal());
Console.WriteLine(s.ToPascal(2));
}
//将字符串的手写字母转换为大写字母的方法
public string toPascal(string s)
{
return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
}</span>
运行效果以下:
最后,小编来简单的介绍1下lambda表达式,C#Lambda基本的表达情势:(参数列表) => {方法体},说明1下,参数列表中的参数类型可以是明确类型或是推断类型,如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来,Lambda 用在基于方法的 LINQ 查询中,作为诸如Where 和 Where 等标准查询运算符方法的参数。我们来看1个具体的例子:
<span style="font-size:18px;">using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
public partial class Form1 : Form
{
//定义1个拜托
public delegate string deleTransfer(string s);
public Form1()
{
InitializeComponent();
}
private void btnTest_Click(object sender, EventArgs e)
{
//拓展方法----
string strTest = "asdsad";
Console.WriteLine(strTest.ToLower());
Console.WriteLine(strTest.ToUpper());
Console.WriteLine(strTest.ToPascal());
Console.WriteLine("-------------------------------------");
//Lambda 来源
//.Net FrameWork 1.0拜托---函数指针
deleTransfer trans = new deleTransfer(ToPascal); //拜托指向方法ToPascal
Console.WriteLine(trans("abcdEFGH"));
//.net 2.0 匿名方法
deleTransfer transs = delegate(string s) { return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower(); };
Console.WriteLine(transs("abcdEFGH"));
//.net 3.5 匿名方法
//deleTransfertransss = (s) => (s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower());
deleTransfer transss = s =>s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();
Console.WriteLine(transss("abcdEFGH"));
}
//将字符串的首字母转化为大写字母的方法
public string ToPascal(string s)
{
return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower();
}
}
public static class ExtraClass
{
//拓展方法,特殊的静态方法
public static string ToPascal(this string s) //this后带类型,表名为该类型添加特殊的方法
{
return s.Substring(0,1).ToUpper() + s.Substring(1).ToLower();
}
public static string ToPascal(this string s, int len) //this后带类型,表名为该类型添加特殊的方法
{
return s.Substring(0,1).ToUpper() + s.Substring(1, len).ToLower() + s.Substring(len + 1);
}
}
</span>
它的发展进程是在C#1.0中使用的拜托,C#2.0中添加了匿名方法,C#3.0中添加了lambda表达式。
小编寄语:该博文,小编主要简单的介绍了linq的1些基本知识,包括linq和sql的对照,linq的扩大方法和lambda表达式,对linq的理解还不是很深入,欢迎小火伴们1起讨论交换,Linq的1个重要功能就是ORMapping思想的具体实现,ORMapping的思想就是实现编程的真正面向对象,使我们不用关心数据库,只需要关系实体类或实体集合类就行。项目进行中,未完待续......
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠