C#之Linq讲解
LINQ(Language Integrated Query)即 语言集成査询。
LINQ是一组语言特性和API,使得你可以使用统一的方式编写各种查询。
LINQ是一种用于.NET Framework的编程模型,旨在将数据查询与编程语言集成在一起。它解决了过去开发者需要为不同类型的数据使用不同语法和API进行查询和操作的问题。通过LINQ,开发者可以使用统一的语法在.NET语言(如C#)中执行查询操作,而无需了解底层的数据源类型和查询方式。
LINQ是一组语言特性和API,允许编写C#或Visual Basic代码以操作内存数据的方式查询数据库。通过使用查询语法,可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。LINQ总是使用对象,因此可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO.NET数据库以及任何其他可用的LINQ提供程序格式的数据。
LINQ主要包含三个部分,其中LINQ to Objects主要负责对象的查询。通过LINQ,开发者可以消除编程语言和数据库之间的不匹配,并为不同类型的数据源提供单个查询接口。
LINQ to Objects
主要负责对象的查询
LINQ to XML
主要负责XML的查询
LINQ tO ADO.NET
主要负责数据库的查询
不使用Linq,使用foreach情况下的操作
using System;
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 WindowsFormsApp12
{
public class DataSource
{
public static int[] getIntArray()
{
return new int[] { 1, 99,2, 3, 4, 55, 3, 655, 45, 66, 88 };
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int[] arr = DataSource.getIntArray();
List<int> list = new List<int>();
// 方案1
foreach (var item in arr)
{
if (item%2==0)
list.Add(item);
}
foreach(var item in list)
{
Console.WriteLine(item);
}
}
}
}
委托的实现
Lambda表达式实现
Linq实现
// 方案1
Console.WriteLine("方案1");
foreach (var item in arr)
{
if (item%2==0)
list.Add(item);
}
foreach(var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine("方案2");
list = arr.Where(p=>p%2==0).ToList();
foreach (var item in list)
{
Console.WriteLine(item);
}
using System;
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 WindowsFormsApp12
{
public class DataSource
{
public static int[] getIntArray()
{
return new int[] { 1, 99,2, 3, 4, 55, 3, 655, 45, 66, 88 };
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int[] arr = DataSource.getIntArray();
List<int> list = new List<int>();
// 方案1
Console.WriteLine("方案1");
foreach (var item in arr)
{
if (item%2==0)
list.Add(item);
}
foreach(var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine("方案2:Ling方法查询");
list = arr.Where(p=>p%2==0).ToList();
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine("方案3:Ling查询");
var query = from val in arr where val%2==0 select val;
foreach (var item in query)
{
Console.WriteLine(item);
}
}
}
}
扩展方法
扩展方法
首先扩展方法声明在静态类中。
扩展方法能够使你向现有类型添加新的方法,而无需创建新的派生类型,重新编译或以其他方式修改
原始类型。
扩展方法是一种特殊的静态方法。但可以象扩展类型上的实例方法一样调用。
他们的第一个参数指定该方法作用于那个类型,并且该类型以this 关键字
修饰符为前缀。
public static class LingExtention
{
/// <summary>
/// 扩展方法
/// </summary>
/// <param name="arr"></param>
/// <param name="findWhere"></param>
/// <returns></returns>
public static IEnumerable<int> where(this int[] arr,findWhere findWhere)
{
foreach (var item in arr)
{
if(findWhere(item))
{
yield return item;
}
}
}
}
using System;
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 WindowsFormsApp12
{
public delegate bool findWhere(int item);
public class DataSource
{
public static int[] getIntArray()
{
return new int[] { 1, 99,2, 3, 4, 55, 3, 655, 45, 66, 88 };
}
}
public static class LingExtention
{
/// <summary>
/// 扩展方法
/// </summary>
/// <param name="arr"></param>
/// <param name="findWhere"></param>
/// <returns></returns>
public static IEnumerable<int> where(this int[] arr,findWhere findWhere)
{
foreach (var item in arr)
{
if(findWhere(item))
{
yield return item;
}
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int[] arr = DataSource.getIntArray();
List<int> list = new List<int>();
// 方案1
Console.WriteLine("方案1");
foreach (var item in arr)
{
if (item%2==0)
list.Add(item);
}
foreach(var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine("方案2:Ling方法查询");
list = arr.Where(p=>p%2==0).ToList();
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.WriteLine("方案3:Ling查询");
var query = from val in arr where val%2==0 select val;
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.WriteLine("方案4:Ling扩展方法");
var query2 = LingExtention.where(arr, p => p % 2 == 0);
foreach (var item in query2)
{
Console.WriteLine(item);
}
}
}
}