C#學習筆記10。本站提示廣大學習愛好者:(C#學習筆記10)文章只能為提供參考,不一定能成為您想要的結果。以下是C#學習筆記10正文
1.匿名類型:匿名類型是C#3.0新增的特性,是強類型(由編譯器後台在生成為CIL時,自動聲明的代碼定義類型),聲明與初始化屬性後其屬性是盡讀屬性。只要在屬性的稱號、順序、類型分歧時,多個聲明匿名變量才會共用同一個匿名類型。其ToString()辦法已重寫了前往的是屬性稱號與值的文本。
2.隱式部分變量:在運用var聲明部分變量時,應該留意2點,辨別為
(1)可以從賦值“=”左邊的類型分明知道右邊的類型聲明,如 new FileInfo("") 可以明白知道是文件烈性,可以運用var。但是左邊若是一個辦法調用,則應該顯式聲明類型。便於知道前往類型,而不必進入辦法外部檢查。
(2)普通在運用匿名類型時可以運用var,由於不能明白知道編譯生成的類型。但在運用Linq等規范查詢運算符中應該運用顯式聲明,如IEnumerable<string> result 比 var result更具可讀性。
3.foreach循環內不要修正集合。
4.集合初始化器:集合初始化器要想編譯成功,需求滿足2點中的一點,辨別為
(1)理想狀況下,集合應該完成了ICollecation<T>接口,這樣就可以保證集合支持一個Add()辦法,編譯器生成的代碼可以調用這個Add()辦法,
(2)寬松狀況下,集合應該完成了IEnumerable<T>接口,其存在一個或多個Add()辦法,即便集合類型沒有完成ICollecation<T>接口,Add()辦法需求承受與集合初始化器中指定的值兼容的參數。
留意,匿名類型是不能直接運用集合初始化器的,由於集合初始化器需求執行一次結構器的調用,但你基本沒法命名這個結構器。有2種方式,
(1)定義一個像上面這樣的辦法,經過調用該辦法即可創立匿名類型的集合,(static List<T> CreateList<T>(T t) { return new List<T>();})。
(2)運用數組處置,如 var items = new[] {...}。
5.規范查詢運算符:在運用where()與select()時,是對集合停止垂直與程度方向的數據處置。在運用Linq中,大局部是延遲執行的舉措,因而運用中應該留意能否有立刻執行的需求,在.Net4.0中添加了PLinq(並行Linq)功用,運用集合的AsParallel(),它是ParallelEnumerable類的一個成員,是一個擴展辦法。然後即可運用並行查詢或過濾數據,
如list.AsParallel().Where(t=>t.Name.StartWith("A"))。
6.在運用Linq停止升序排序時,第一個排序辦法要運用OrderBy(),前面其他排序運用ThenBy(),降序同理。
7.Join與GroupJoin:前者為2個集合的內聯接(同等sql的inner Join);後者為分組聯接(完成一對多關系),即右邊集合分組後對應的左邊集合那些元素。
8.左外聯:運用GroupJoin().SelectMany()和DefaultIfEmpty()來完成的,可檢查CorporateData.GetLeftInnerData()辦法中的代碼。
9.我們偶然會處置有集合構成的集合,若有取得其中每一項需求雙重的嵌套遍歷,這裡可以運用SelectMany()辦法處置,其可以是集合的集合變成一個單一的新集合。
public class CorporateData { public static Department[] Departments = new Department[] { new Department(){Id = "1",Name = "法務部"}, new Department(){Id = "2",Name = "信息部"}, new Department(){Id = "3",Name = "市場部"}, new Department(){Id = "4",Name = "財務部"}, new Department(){Id = "5",Name = "行政部"} }; public static Employee[] Employees = new Employee[] { new Employee() {No = "01",Name = "柳一",CallName = "主管",DepartmentId = "1"}, new Employee() {No = "01",Name = "徐二",CallName = "主管",DepartmentId = "1"}, new Employee() {No = "01",Name = "張三",CallName = "主管",DepartmentId = "3"}, new Employee() {No = "01",Name = "李四",CallName = "主管",DepartmentId = "3"}, new Employee() {No = "01",Name = "王五",CallName = "主管",DepartmentId = "2"}, new Employee() {No = "01",Name = "朱六",CallName = "主管",DepartmentId = "2"}, new Employee() {No = "01",Name = "彥七",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "毛八",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "黃九",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "成十",CallName = "主管",DepartmentId = "4"} }; //集合左外銜接處置 public static void GetLeftInnerData() { var result = Departments.GroupJoin(Employees, d => d.Id, e => e.DepartmentId, (d, dEmployees) => new { d.Id, d.Name, Employees = dEmployees }) .SelectMany(departmentEmployees => departmentEmployees.Employees.DefaultIfEmpty(), (d, e) => new { d.Name, employee = e }); foreach (var item in result) { Console.WriteLine("department : {0}, employee : {1}", item.Name, item.employee); } } //分組集合 public static void GetGroupBy() { IEnumerable<IGrouping<string, Employee>> result = Employees.GroupBy(e => e.DepartmentId); foreach (IGrouping<string, Employee> item in result) { Console.WriteLine(item.Key); foreach (Employee employee in item) { Console.WriteLine("\t{0}", employee); } } } } public class Department { public string Id; public string Name; } public class Employee { public string No; public string Name; public string CallName; public string DepartmentId; public override string ToString() { return string.Format("Name={0}, CallName={1}", Name, CallName); } }
---------------------------以上內容依據《C#實質論 第三版》停止整理