一,.net 3.0新特性
(1) 隐含类型局部变量
变量可以使用var类型来声明
static void Main(string[] args)
{
var i = 1;
var j = true;
var a = "fsa";
Console.Write(i);
Console.Write(j);
Console.Write(a);
}
编译的时候通过clr判断类型变量
Var声明局部变量
也可以使用在foreach,using局部中
隐含变量的声明必须要有初始化语句
(2) 扩展方法
程序集在部署后,还能够向其中添加方法,扩展方法的本质为将实例方法调用在编译期该变为静态类中的静态方法调用,扩展方法是一种编译时技术
声明一个静态类,然后写一个静态类方法,静态方法的参数要使用this 数据类型 参数名
class Program
{
static void Main(string[] args)
{
string pwd=Console.ReadLine();
bool b=pwd.CheckUserPwd();
if (b)
{
Console.WriteLine("ok");
}
else
{
Console.WriteLine("error");
}
}
}
public static class ExtendString
{
public static bool CheckUserPwd(this string str)
{
if (str.Length > 6 && str.Length < 12)
{
return true;
}
else
{
return false;
}
}
}
(3) 自动属性
class Program
{
private int i;
private string str;
public int I { get; set; }
public string Str { get; set; }
static void Main(string[] args)
{
Program p1 = new Program();
Console.WriteLine(p1.I);
}
}
或者
class Program
{
public int I { get; set; }
public string Str { get; set; }
static void Main(string[] args)
{
Program p1 = new Program();
p1.I = 20;
Console.WriteLine(p1.I);
}
}
(4) 对象与集合初始化器
class Program
{
public int Age
{ get;set;}
public string Name
{ get;set;}
public int Salary
{ get;set;}
static void Main(string[] args)
{
Program p1 = new Program { Age=13,Name="fsafe",Salary=3000};
//范型集合
List<Program> list = new List<Program>
{
new Program{Age=35,Name="vea",Salary=2567},
new Program{Age=45,Name="verrtr",Salary=2909},
};
Console.WriteLine(list[1].Salary);
}
}
(5) 匿名类
class Program
{
public int Age
{ get; set; }
public string Name
{ get; set; }
public int Salary
{ get; set; }
static void Main(string[] args)
{
//匿名类
var myClass = new {Name="fafd",Salary=546};
Console.WriteLine(myClass.Name);
}
}
匿名类型直接继承自System.Object
匿名类型的成员是编译器根据初始化器推断
匿名类型没有类名
二,匿名方法
匿名方法可以看作是一个委托的扩展,是一个没有命名的方法
delegate int Sum(int a,int b); //声明匿名方法
protected void Page_Load(object sender, EventArgs e)
{
Sum s = delegate(int a,int b) //使用匿名方法
{
return a + b; //返回值
};
}
三,lambda表达式
List<People> people = new List<People>(); //创建泛型对象
People p1 = new People(21,"guojing"); //创建一个对象
People p2 = new People(21, "wujunmin"); //创建一个对象
People p3 = new People(20, "muqing"); //创建一个对象
People p4 = new People(23, "lupan"); //创建一个对象
people.Add(p1); //添加一个对象
people.Add(p2); //添加一个对象
people.Add(p3); //添加一个对象
people.Add(p4);
四,linq
LINQ是一种能够快速对大部分数据源进行访问和数据整合的一种技术。LINQ能够面向更多的对象,这些对象包括数组、集合以及数据库
from语句指定项目名称和数据源,并且指定需要查询的内容
(1) LINQ(主要作用就是查询)
class Program
{
static void Main(string[] args)
{
//var lists = new string[]{"veraafewa","ffsaf","uyjmgds" };
//foreach(var arr in lists)
//{
// if(arr.Length>4)
// {
// Console.WriteLine(arr);
// }
//}
//2.0写法,匿名委托
//Where是一个扩展了数组的方法
//var result = lists.Where(
// delegate(string s)
// {
// return s.Length > 4;
// }
// );
//lambda表达式,=>相当于委托
//var result = lists.Where(o=>o.Length>4);
//foreach(var arr in result)
//{
// Console.WriteLine(arr);
//}
//Linq写法
var lists = new string[] { "veraafewa", "ffsaf", "uyjmgds" };
var result=from o in lists where o.Length>4 select o;
foreach(var r in result)
{
Console.WriteLine(r);
}
}
}
(8)linq语法
1,
static void Main(string[] args)
{
var arr = new int[] {1,2,3,4,5,6,7 };
//linq语法
var result = from o in arr select o;
foreach (var r in result)
Console.WriteLine(r);
}
2,
static void Main(string[] args)
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
//linq语法
var result = from o in arr where o>10 select o;
foreach (var r in result)
Console.WriteLine(r);
}
3,
class Program
{
static void Main(string[] args)
{
var arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
//linq语法
var result = from o
in (from n in arr where n>100 select n)
where o%2==0
select o;
foreach (var r in result)
Console.WriteLine(r);
}
}
4,
class Program
{
static void Main(string[] args)
{
//隐藏类型
//初始化器
var arr = new []
{
//匿名类
new {Name="fd",Age=23,Sal=1200},
new {Name="ver",Age=21,Sal=1800},
new {Name="mk",Age=28,Sal=1900},
};
var result = from o in arr where o.Name =="fd" select o;
foreach(var v in result)
{
Console.WriteLine(v.Sal);
}
}
}
5,linq中使用Contains()方法实现模糊查找
class Program
{
static void Main(string[] args)
{
//隐藏类型
//初始化器
var arr = new[]
{
//匿名类
new {Name="fd",Age=23,Sal=1200},
new {Name="ver",Age=21,Sal=1800},
new {Name="mk",Age=28,Sal=1900},
};
var result=from o in arr where o.Name.Contains("f") select o;
foreach (var v in result)
Console.WriteLine(v.Sal);
}
}
6,分组查询
class Program
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
class Class6
{
static void Main(string[] args)
{
Program[] p = new Program[]
{
new Program{Name="vedew",Age=23,Address="opjojk"},
new Program{Name="zxs",Age=23,Address="wqw"}
};
var result = from s1 in p group s1 by s1.Address into o select new { Address = o.Key, p = o };
foreach(var v1 in result)
{
Console.WriteLine("城市所在地:"+v1.Address);
foreach(var v2 in v1.p)
{
Console.WriteLine(v2.Name);
}
}
}
}
7,倒序排列
class Program
{
static void Main(string[] args)
{
var arr = new string[] {"vae","veew","bhrw" };
var result = from s1 in arr orderby s1 descending select s1;
foreach (var r in result)
Console.WriteLine(r);
}
}
8,去掉查询集合中重复的元素
static void Main(string[] args)
{
var arr = new[]
{
//匿名类
new {Name="fd",Age=23,Sal=1200},
new {Name="ver",Age=21,Sal=1800},
new {Name="mk",Age=28,Sal=1900},
};
var result=(from s1 in arr select s1.Age).Distinct();
foreach (var r in result)
Console.WriteLine(r);
}
9,联合查询
class Program
{
static void Main(string[] args)
{
var students = new[]
{
new {Name="1",Address="武汉"},
new {Name="2",Address="成都"},
new {Name="3",Address="福建"}
};
var stu = new[]
{
new {Name="1",ID=1},
new {Name="2",ID=2},
new {Name="3",ID=3}
};
var result = from s1 in students join s2 in stu on s1.Name equals s2.Name select new {Name=s1.Name,Address=s1.Address,ID=s2.ID };
foreach (var r in result)
Console.WriteLine(r.Name+””+r.Address+””+r.ID);
}
}
10,取出前面几条数据
static void Main(string[] args)
{
var stu = new[]
{
new {Name="1",Address="wuhan"},
new {Name="2",Address="wuhan"},
new {Name="3",Address="wuhan"},
new {Name="4",Address="wuhan"},
new {Name="5",Address="wuhan"}
};
var result=(from s1 in stu select s1).Take(4);
foreach (var r in result)
Console.WriteLine(r.Name+""+r.Address);
}
11,取出第一个满足条件的结果
class Program
{
static void Main(string[] args)
{
var stu = new[]
{
new {Name="1",Address="wuhan"},
new {Name="2",Address="wuhan"},
new {Name="3",Address="wuhan"},
new {Name="4",Address="wuhan"},
new {Name="5",Address="wuhan"}
};
var result=(from s1 in stu select s1).First(x=>x.Address=="wuhan");
Console.WriteLine(result.Address+""+result.Name);
}
}
12,进行统计
class Program
{
static void Main(string[] args)
{
var stu = new[]
{
new {Name="1",Address="wuhan",Sal=1233},
new {Name="2",Address="wuhan",Sal=789},
new {Name="3",Address="wuhan",Sal=654},
new {Name="4",Address="wuhan",Sal=3243},
new {Name="5",Address="wuhan",Sal=2678}
};
var result = (from s1 in stu select s1).Sum(x=>x.Sal);
Console.WriteLine(result);
}
}
Linq操作数据集
1,class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql,con);
sda.Fill(ds);
var result = from s1 in ds.Tables[0].AsEnumerable()
//方式1
//where (string)s1["Customer"] =="author"
//方式2
where s1.Field<string>("Customer")=="author"
select s1;
foreach(var r in result)
{
Console.WriteLine(r["Computer"]);
}
}
}
2,操作数据集并修改数据
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql,con);
sda.Fill(ds);
var result = from s1 in ds.Tables[0].AsEnumerable()
//方式1
//where (string)s1["Customer"] =="author"
//方式2
where s1.Field<string>("Customer")=="author"
select s1;
foreach(var r in result)
{
Console.WriteLine(r["Computer"]);
}
//操作数据集
result.First().SetField<string>("Company","Microsoft");
SqlCommandBuilder builder = new SqlCommandBuilder(sda);
sda.Update(ds);
var result1 = from s1 in ds.Tables[0].AsEnumerable()
//方式1
//where (string)s1["Customer"] =="author"
//方式2
where s1.Field<string>("Customer") == "author"
select s1;
foreach (var r in result)
{
Console.WriteLine(r["Computer"]);
}
}
}
3,操作数据集并排序
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
sda.Fill(ds);
var result = (from s1 in ds.Tables[0].AsEnumerable() select s1).AsDataView();
result.Sort = "CompanyName desc";
foreach (DataRowView row in result)
Console.WriteLine(row["CompanyName"]);
}
}
4,数据集中两张表查询
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
sda.Fill(ds,"table1");
sql="";
sda = new SqlDataAdapter(sql,con);
sda.Fill(ds,"table2");
var result = from c in ds.Tables["UserNameId"].AsEnumerable()
join o in ds.Tables["Orders"].AsEnumerable()
on c.Field<string>("CustomerID") equals o.Field<string>("fdw")
where o.Field<DateTime>("OrderDate") > DateTime.Parse("1997/1/1") && o.Field<DateTime>("OrderDate") < DateTime.Parse("1997/5/1")
select new
{
OrderId = o.Field<string>("Name"),
CompanyName=c.Field<string>("CompanyName")
};
foreach(var r in result)
Console.WriteLine(r.OrderId+""+r.CompanyName);
}
}
5,数据集中分组
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
sda.Fill(ds,"table1");
var result = from c in ds.Tables["UserNameId"].AsEnumerable()
group c by c.Field<string>("dealkd") into orders
select new
{
OrderID=orders.First().Field<int>("verfa"),
CustomerID=orders.Key
};
foreach(var r in result)
Console.WriteLine(r.OrderID.ToString()+""+r.CustomerID.ToString());
}
}
6,前5条数据
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
sda.Fill(ds,"table1");
var result = (from c in ds.Tables["UserNameId"].AsEnumerable()
select c).Take(5);
foreach(var r in result)
Console.WriteLine();
}
}
7,求总和
class Program
{
static void Main(string[] args)
{
SqlConnection con = new SqlConnection();
string sql = "";
DataSet ds = new DataSet();
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
sda.Fill(ds,"table1");
var result = (from c in ds.Tables["UserNameId"].AsEnumerable()
select c).Sum(x=>x.Field<decimal>("vnaoiej")*x.Field<int>("vaeonnak"));
Console.WriteLine();
}
}
IEnumerable<People> results = people.Where(People => People.age > 20); //Lambda
Lambda表达式的格式如下所示。
(参数列表)=>表达式或者语句块
Lambda表达式树的基本形式有两种,这两种形式代码如下所示。
Func<int, int> func = pra => pra * pra; //创建表达式树
Expression<Func<int, int>> expression = pra => pra * pra; //创建表达式树
Lambda表达式树就是将Lambda表达式转换成树状结构,示例代码如下所示。
Func<int, int> func = (pra => pra * pra); //创建表达式
Response.Write(func(8).ToString()); //执行表达式
Response.Write("<hr/>");
上述代码直接用Lambda表达式初始化Func委托,运行后返回的结果为64,同样使用Expression类也可以实现相同的效果,示例代码如下所示。
Expression<Func<int, int>> expression = pra => pra * pra; //创建表达式
Func<int, int> func1 = expression.Compile(); //编译表达式
Response.Write(func1(8).ToString());
访问Lambda表达式的方法非常简单,直接将表达式输出即可,示例代码如下所示。
Expression<Func<int, int>> expression = pra => pra * pra; //创建表达式树
Func<int, int> func1 = expression.Compile(); //表达式树编译
Response.Write(func1(8).ToString()); //执行表达式
Response.Write(expression.ToString()); //执行表达式
IEnumerable<People> results = people.Where(delegate(People p) { return p.age > 20; });//匿名方法