.Net高级技术:Linq

一、类的扩展方法

//帮助类标记为static
public static class StringHelper
{
//扩展的方法也要标记为静态的
public static bool IsEmail(this string str)//this要紧跟扩展的类型
{
bool result = true;
if (!str.Contains("@"))
{
result = false;
}
return result;
}

public static string BoolToString(this bool b)
{
string str = string.Empty;
if (b)
{
str="真";
}
else
{
str = "假";
}
return str;
}

public static string BbQuote(this string str, string pre, string tag)
{
return pre + str + tag;
}

}

 

调用扩展的方法:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
string email = "123@qq.com";
bool b = email.IsEmail();
string msg= b.BoolToString();
MessageBox.Show(msg);
MessageBox.Show(email.BbQuote("_","|"));
}
}

 二、C#的Var变量类型

===》他是专为匿名对象而生

var p = new { Name="Tom",Age=12};//这样的匿名类的对象的是只读的

应用场景:表示推断,编程的时候不用写出它的类型,直接使用Var,编译器在编译的时候会自动推断

三、Linq

int[] arry = {1,2,3,5,4,6 };

//常规写法
var newArry = arry.Where(i=>i>3).OrderByDescending(i=>i).Select(i=>"["+i+"]");

//微软简化的写法(在编译的时候会转为上面的形式)

var newArrys = from item in arry
where item > 3
orderby item descending
select "["+item+"]";//基于类型推断的需要,将Select置于最后

 

//将所有大于20岁的人名用,分割打印出来
Person[] perArry = {
new Person(){Name="Tom",Age=12},
new Person(){Name="Jerry",Age=30},
new Person(){Name="Francis",Age=20}
};
var newPerArry = from per in perArry
where per.Age >= 20
orderby per.Age descending
select per.Name;//查询出来的结果
string res=string.Join(",", newPerArry);//增加了重载

 

//查询出年龄相同及相同年龄的人数统计出来group的语法
var newRes = from per in perArry
group per by per.Age into g
select new {Age=g.Key,Count=g.Count()};//查询出来返回一个匿名对象
foreach (var item in newRes)
{
Console.WriteLine(item.Age+":"+item.Count);
}

 

//Linq只能用于泛型的序列(Cast和OfType解决)
DataTable dt = null;
//Cast将非泛型序列转为泛型序列
DataRow dr= dt.Rows.Cast<DataRow>().Single();

 

Object[] objArry = { 1,2,3,"aa"};
foreach (var item in objArry.OfType<int>())//将上述数组中属于int类型的才转为泛型序列
{
Console.WriteLine(item);
}

 

三、IEnumerable<T>的扩展方法

Average计算平均值; Min最小元素;Max最大元素;Sum元素总和; Count元素数量;
Concat连接两个序列;//Unoin all
Contains序列是否包含指定元素;
Distinct取得序列中的非重复元素;
Except获得两个序列的差集;
Intersect获得两个序列的交集;
First取得序列第一个元素;
Single取得序列的唯一一个元素,如果元素个数不是1个,则报错;!!!严谨的程序。
FirstOrDefault 取得序列第一个元素,如果没有一个元素,则返回默认值;

四、Linq在MVC.Net中的复杂应用在后续开发中再作补充(多泛型集合的连接查询)

posted @ 2018-12-22 17:01  Francis_Ray  阅读(268)  评论(0编辑  收藏  举报