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#實質論 第三版》停止整理