1.匿名類型:匿名類型是C#3.0新增的特性,是強類型(由編譯器後臺在生成為CIL時,自動聲明的代碼定義類型),聲明與初始化屬性後其屬性是盡讀屬性。只有在屬性的名稱、順序、類型一致時,多個聲明匿名變數才會共用同一個匿名類型。其ToString()方法已重寫了返回的是屬性名稱與值的文本。 2.隱式局部 ...
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#本質論 第三版》進行整理