MVC學習之前必須掌握的c#基礎知識,
一.類自動屬性

![]()
1 public class Person
2 {
3 //自動屬性
4 public string Name { get; set; }
5
6 private int _age;
7
8 public int age {
9 get { return _age; }
10 set { _age = value; }
11 }
12 }
View Code
Name為類的自動屬性,其實跟下面age的定義方法是一樣的,只不過是微軟自動幫你生成了字段。
二.隱式類型

![]()
1 static void Var()
2 {
3 var person = new Person();
4
5 var p = person;
6 }
View Code
1.var類型會被編譯器根據初始值的類型自動推斷出具體的類型。
2. var類型不能做參數。
3.無法將null賦值給var類型。
4.語句中只聲明一次變量,聲明後不能更改類型。
三、匿名類

![]()
1 static void W02AnmClass()
2 {
3 var d = new { name = "張三", age = 13 };
4 var d2 = new { name = 12, age = "13" };
5 var d3 = new { name = "張三", age = "13", gender="男"};
6 }
View Code
1.匿名類本質上是編譯器生成的一個泛型類。
2.當匿名類的參數個數一樣的時候是共用一個泛型類。
3.當匿名類的參數個數不一樣的時候是各自生成不同的泛型類。
4.匿名類初始化的時候一定要賦值。
四、默認值和命名參數

![]()
1 static void W03DefaultValue()
2 {
3 W0301();
4 W0301("李四");
5 W0301(age: 20);
6 }
7 static void W0301(string name="張三",int age=18)
8 {
9 Person person = new Person();
10 person.Name = name;
11 person.Age = age;
12 }
View Code
1.當一個方法裡面的參數有默認值的時候,可以直接調用方法不用傳值,編譯器會自動調用參數的值。
2.當方法有默認值時,如果調用的時候只傳入第一個參數,那麼編譯器會把第二個參數設置為默認值。
3.如果需要給某一個參數賦值,書寫的格式是 參數名:值。
五、對象/集合初始化器

![]()
1 static void W0401Object()
2 {
3 Person person = new Person() {
4 Name="張三",
5 Age=23
6 };
7 }
8 static void W0402Object()
9 {
10 var personlist = new List<Person>() {
11 new Person() {Name="張三",Age=22 },
12 new Person() {Name="李四",Age=12 }
13 };
14 }
15 static void W0403Object()
16 {
17 Person[] arrperson = new Person[] {
18 new Person() {Name="張三",Age=22 }
19 };
20 }
View Code
1.對象/集合初始化器,可以在new一個對象或者集合的時候,直接在後面加{}裡面對屬性直接賦值或者直接new一個對象給集合。
六、匿名方法(匿名函數、匿名委托)

![]()
1 static bool Process(int p)
2 {
3 return p > 2;
4 }
5
6 static void W0401()
7 {
8 List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
9 //直接傳入一個方法名稱也可以不過這個方法名稱的參數以及返回值類型要跟
10 //public delegate bool Predicate<in T>(T obj);一樣
11 var nlist =list.FindAll(Process);
12 foreach (var item in nlist)
13 {
14 Console.WriteLine(item);
15 }
16
17 Console.WriteLine("=================");
18 //匿名方法的寫法:delegate(編寫匿名方法的參數,參數有程序員自己定義){函數的方法體代碼}
19 var nlist2 = list.FindAll(delegate (int p) { return p > 3; });
20 foreach (var item in nlist2)
21 {
22 Console.WriteLine(item);
23 }
24 }
View Code
七、lambda表達式的推斷以及書寫方法

![]()
1 List<Person> persons = new List<Person>() {
2 new Person { Name="張三",Age=12},
3 new Person { Name="李四",Age=32},
4 new Person { Name="王五",Age=44}
5 };
6 //使用匿名方法返回符合條件的數據。
7 var nlistperson= persons.FindAll(delegate (Person person) { return person.Age > 22 && person.Name.Contains("李"); });
8 //lambda表達式的推斷使用goto語句來替換匿名函數 =>
9 var nlistperson2 = persons.FindAll((Person person)=> { return person.Age > 22 && person.Name.Contains("李"); });
10
11 /*
12 1、lambda表達式的推斷使用goto語句來替換匿名函數 => 繼續簡化
13 2、當只有一個參數的時候可以省略()參數的括號,當返回值只有一句語句的時候可以省略return以及{}花括號
14 3、當有多個參數的時候需要加上(),當有多條語句的時候需要添加{}每個語句後面加分號;最後返回的語句要加return
15 */
16 var nlistperson3 = persons.FindAll(person => person.Age > 22 && person.Name.Contains("李"));
17
18 var nlistperson4 = persons.FindAll(person => {
19 person.Age++;
20 return person.Age > 22 && person.Name.Contains("李");
21 });
22
23 foreach (var item in nlistperson4)
24 {
25 Console.WriteLine("名稱:{0};年齡:{1}",item.Name,item.Age);
26 }
View Code
八、擴展方法

![]()
1 /// <summary>
2 /// 1.擴展方法必須是一個靜態方法
3 /// 2.靜態方法必須放在靜態類中
4 /// 3.擴展方法第一個參數必須是this開頭,並且指定擴展方法是哪個類型上的
5 /// 4.擴展方法只能有指定的類型才能點出來
6 /// 5.擴展方法的this後面的參數不屬於 方法的參數
7 /// 6.如果擴展方法跟實例方法同名,先調用實例方法
8 /// 7.子類可以調用父類的擴展方法
9 /// 8.接口上的擴展方法可以被實現類的對象直接使用
10 /// 9.擴展方法的本質,最終還是被編譯器編譯成了 靜態類.靜態方法()
11 /// </summary>
12 static void W0601()
13 {
14 DateTime dt = DateTime.Now;
15 string fmtstr= dt.FmtDate();
16 }
View Code

![]()
1 public static class ExtHelper
2 {
3 public static string FmtDate(this DateTime dt)
4 {
5 return dt.ToString("YYYY-MM-DD HH:MM:ss");
6 }
7 public static string FmtDate(this DateTime dt,string str)
8 {
9 return dt.ToString("YYYY-MM-DD HH:MM:ss"+str);
10 }
11 }
View Code
九、系統內置的委托

![]()
1 #region 系統內置委托
2 #region Action委托 接收參數 無法回值
3 static void W0701Action()
4 {
5 List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
6
7 list.ForEach(i => Console.WriteLine(i));
8 }
9 #endregion
10
11 #region Predicate 泛型委托:接收一個參數,返回bool類型
12 static void W0702Predicate()
13 {
14 var list = new List<Person>(){
15 new Person { Name = "張三", Age = 12 },
16 new Person { Name = "李四", Age = 32 },
17 new Person { Name = "王五", Age = 44 }
18 };
19
20 var nlist = list.FindAll(c => c.Age > 22);
21 //獲取當前list集合中,名字為張三的對象,如果有多個只返回第一個
22
23 var person = list.Find(c => c.Name == "張三");
24 }
25 #endregion
26
27 #region Func:接收參數,返回參數,但是不固定
28 static void W0703Func()
29 {
30 var list = new List<Person>(){
31 new Person { Name = "張三", Age = 12 },
32 new Person { Name = "李四", Age = 32 },
33 new Person { Name = "王五", Age = 44 }
34 };
35
36 var nlist = list.Where(c => c.Age > 1);
37 var nlist1 = nlist.ToList();
38 nlist1.ForEach(c => Console.WriteLine(c.Name.ToString()));
39 }
40 #endregion
41
42 #region System.Comparison<T> 返回一個整數,接收兩個同類型的參數
43 static void W0704Comparison()
44 {
45 var list = new List<Person>(){
46 new Person { Name = "張三", Age = 12 },
47 new Person { Name = "李四", Age = 32 },
48 new Person { Name = "王五", Age = 44 }
49 };
50
51 list.Sort((p, n) =>p.Age - n.Age);
52 list.ForEach(c=>Console.WriteLine(c.Name.ToString()+":"+c.Age.ToString()));
53 }
54
55 #endregion
56 #endregion
View Code
十、SQO方法 -標准查詢運算符
創建兩個類

![]()
1 public class Person
2 {
3 public int TypeID { get; set; }
4
5 public int ID { get; set; }
6 //自動屬性
7 public string Name { get; set; }
8
9 private int _age;
10
11 public int Age {
12 get { return _age; }
13 set { _age = value; }
14 }
15
16 public override string ToString()
17 {
18 return "ID=" + this.ID + "名稱=" + this.Name + ",年齡=" + this.Age + "所屬類別=" + this.TypeID;
19 }
20 }
21
22 public class PsersonType
23 {
24 public int TypeID { get; set; }
25 public string TName { get; set; }
26 }
View Code
SQO常用方法的使用 查詢、排序、關聯、分組等

![]()
1 #region SQO方法 -標准查詢運算符
2 #region 1 where() firstordefult() LastOrDefault方法進行查找操作 (鏈式編程)
3 static void W0801()
4 {
5 var list = new List<Person>(){
6 new Person { Name = "張三", Age = 12 },
7 new Person { Name = "李四", Age = 32 },
8 new Person { Name = "王五", Age = 44 }
9 };
10
11 //利用where查找出list中年齡大於22或者名稱叫王五
12 //鏈式編程
13 list.Where(c => c.Age > 5 || c.Name == "王五").ToList().ForEach(c => Console.WriteLine(c.ToString()));
14
15 //firstordefult()的演示
16 var person= list.FirstOrDefault(c => c.Age > 5 || c.Name == "王五");
17 Console.WriteLine(person.ToString());
18
19 //獲取集合中滿足條件的最後一個元素
20 var person2 = list.LastOrDefault(c => c.Age > 5 || c.Name == "王五");
21 Console.WriteLine(person.ToString());
22
23 }
24 #endregion
25
26 #region 2 對集合進行排序(正序和倒序)
27 static void W0802()
28 {
29 var list = new List<Person>(){
30 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
31 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
32 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1}
33 };
34 //正序
35 list.OrderBy(c => c.Age).ToList().ForEach(c => Console.WriteLine(c.ToString()));
36 Console.WriteLine("---------");
37 //倒序
38 list.OrderByDescending(c => c.Age).ToList().ForEach(c => Console.WriteLine(c.ToString()));
39 }
40 #endregion
41
42 #region 3 根據多個字段的組合排序
43 static void W0803()
44 {
45 var list = new List<Person>(){
46 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
47 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
48 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1}
49 };
50 //多個條件進行正序 先按照年齡然後按照ID正序
51 list.OrderBy(c => c.Age).ThenBy(c => c.ID).ToList().ForEach(c => Console.WriteLine(c.ToString()));
52
53 //多條件倒序
54 list.OrderByDescending(c => c.Age).ThenByDescending(c => c.ID).ToList().ForEach(c => Console.WriteLine(c.ToString()));
55 }
56 #endregion
57
58 #region 4 投影方法(Select) ( 重點 )
59 static void W0804()
60 {
61 var list = new List<Person>(){
62 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
63 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
64 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1}
65 };
66 //取出list集合裡面的部分字段
67 List<string> nlist = list.Select(c => c.Name).ToList();
68
69 //重新創建一個新的list集合只包含name和age
70 list.Select(c => new { N = c.Name, A = c.Age }).ToList().ForEach(c => Console.WriteLine(c.ToString()));
71 }
72 #endregion
73
74 #region 5 分頁方法 Skip(skipNum).Take(頁容量) Skip():表示跳過集合中的前面多少行
75 static void W0805()
76 {
77 int rowcount = 0;
78 W0805ByPage(1, 2, out rowcount).ForEach(c => Console.WriteLine(c.ToString()));
79 }
80 static List<Person> W0805ByPage(int pageindex, int pagesize, out int rowcount)
81 {
82 var list = new List<Person>(){
83 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
84 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
85 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1}
86 };
87 // 給rowcount賦予滿足條件的數據總行數
88 rowcount = list.Count();
89 //經過第幾頁跳過跳過多少條
90 int skipCount = (pageindex - 1) * pagesize;
91 return list.Where(c => c.Age > 1).Skip(skipCount).Take(pagesize).ToList();
92 }
93 #endregion
94
95 #region 6 連表查詢Join
96 static void W0806()
97 {
98 var list = new List<Person>(){
99 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
100 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
101 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1},
102 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=3}
103 };
104
105 var typelist = new List<PsersonType>()
106 {
107 new PsersonType(){TypeID=1,TName="老師"},
108 new PsersonType(){TypeID=3,TName="學生"},
109 new PsersonType(){ TypeID=2, TName="保安"}
110 };
111
112 //利用SQO方法Join() 來實現上述業務邏輯
113 var nlist = list.Join(typelist, p => p.TypeID, c => c.TypeID, (p, c) =>new { p.Name,p.Age,c.TName }).ToList();
114
115 nlist.ForEach(c => Console.WriteLine(c.ToString()));
116 }
117 #endregion
118
119 #region 7 分組 GroupBy()
120 static void W0807()
121 {
122 var list = new List<Person>(){
123 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
124 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
125 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1},
126 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=3}
127 };
128
129 //利用SQO方法進行分組操作
130 list.GroupBy(c => c.TypeID).ToList().ForEach(c => {
131 Console.WriteLine("----分組號{0}" + c.Key,c.ToList().Count());
132 c.ToList().ForEach(g => Console.WriteLine(g.ToString()));
133 });
134 }
135 #endregion
136 #endregion
View Code
十一、linq的常用方法

![]()
1 #region Linq使用方法
2 #region 1 Linq實現排序
3 static void w0901()
4 {
5 var list = new List<Person>(){
6 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
7 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
8 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1},
9 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=3}
10 };
11 //需求:根據list集合中的age倒序排列後取出pig對象中的Name和Age
12 //ascending :正序 descending:倒序
13 var orderbyList = (from c in list
14 orderby c.Age descending
15 select new { c.Name, c.Age }).ToList();
16 orderbyList.ForEach(c => Console.WriteLine(c.ToString()));
17 }
18 #endregion
19
20 #region 2 LinqJoin實現集合的鏈接查詢
21 static void W0902()
22 {
23 var list = new List<Person>(){
24 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
25 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
26 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1},
27 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=3}
28 };
29
30 var typelist = new List<PsersonType>()
31 {
32 new PsersonType(){TypeID=1,TName="老師"},
33 new PsersonType(){TypeID=3,TName="學生"},
34 new PsersonType(){ TypeID=2, TName="保安"}
35 };
36
37 var nlist = (from c in list
38 join t in typelist
39 on c.TypeID equals t.TypeID
40 select new { c.Name, c.ID, t.TName }).ToString();
41
42 }
43 #endregion
44
45 #region Linq分組
46 static void W0903()
47 {
48 var list = new List<Person>(){
49 new Person {ID=1, Name = "張三", Age = 12,TypeID=1 },
50 new Person {ID=2,Name = "李四", Age = 32 ,TypeID=2},
51 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=1},
52 new Person {ID=3,Name = "王五", Age = 44 ,TypeID=3}
53 };
54
55 var groupbylist = (from c in list
56 group c by c.TypeID).ToList();
57
58 groupbylist.ForEach(c =>
59 {
60 Console.WriteLine("-----分組號=" + c.Key);
61 c.ToList().ForEach(g => Console.WriteLine(g.ToString()));
62 });
63
64 }
65 #endregion
66 #endregion
View Code