LINQ to Objects是LINQ的一部分,是查詢對象集合的一種語法。首先看一下LINQ的體系結構,這樣對LINQ有一個大致的了解。如圖。
第一篇文章主要是回顧一下學習LINQ to Objects相關的基礎知識,主要分為以下幾個方面。
1,隱式類型局部變量
2,匿名類型
3,擴展方法
4,對象初始化器
5,集合初始化器
6,Lambda表達式
隱式類型局部變量,從名字中可以得出兩層含義,一是隱式類型,即相對于顯式類型(或稱為強類型)而言的,指不需要指定具體類型,而是由右邊表達式推斷出的類型。第二層含義是局部變量,指的是只能用于方法內部的局部變量,不能用在字段或方法參數上。隱式類型局部變量通常是用var關鍵字表示的。演示代碼如下。
//原來寫法string userName = "James";int age = 29;string[] userList = new string[] { "a","b","c"};foreach (string user in userList){ Console.WriteLine(user);}//現在寫法var userName = "mcgrady";var age = 29;var userList = new[] { "a", "b", "c" };foreach (var user in userList){ Console.WriteLine(user);}匿名類型是C#的一種新特性,通常我們創建類型對象都是通過new關鍵字再跟上類名來創建的,但是匿名類型卻不需要指定類型名稱,而是由編譯器為我們自動創建一個類型名稱,而且不會告訴我們這個類型名稱是什么。匿名類型又稱為行內類型,通常與var關鍵字配合使用。演示代碼如下。
var data = new { UserName = "mcgrady", Age = "29" };Console.WriteLine("UserName:{0},Age:{1}", data.UserName, data.Age);擴展方法使我們當我們沒有源代碼的情形下,仍可以對CLR類型或自定義類型進行一些擴展操作。同時它也是學習LINQ to Objects的基礎。另外,擴展方法只能定義在靜態類的靜態方法中,并且如果擴展方法名不能同原方法名同名,否則擴展方法將會失效。演示代碼如下。
public static class StringExtension { /// <summary> /// 將當前字符串轉換為int /// </summary> /// <param name="str"></param> /// <param name="result"></param> /// <returns>如果成功則返回字符串的int形式,如果失敗則返回默認值</returns> public static int ToInt(this string str, int result = -110) { int value; if (int.TryParse(str, out value)) { return value; } else { return result; } } }//擴展方法調用string str = "111";int result = str.ToInt();在沒有對象初始化器之前,我們創建一個對象大概需要經過這么兩個步驟,首先new一個對象,然后給每個字段賦值。而有了對象初始化器之后,原本需要幾行代碼才能完成的任務變成一行代碼就可以完成,簡化了代碼,也使代碼更優雅。演示代碼如下。
//原來寫法Person person = new Person();person.UserName = "James";person.Age = 28;//現在寫法Person person = new Person { UserName = "James", Age = 28 };Console.WriteLine("UserName:{0},Age:{1}", person.UserName, person.Age);使用集合初始化器,編譯器會自動幫我們生成Add插入操作,前提是集合實現了IEnumerable接口。同對象初始化器一樣,使用集合初始化器增強代碼可讀性的同時使我們寫的代碼量更少了。演示代碼如下。
//原來寫法List<Person> personList = new List<Person>();personList.Add(new Person { UserName = "Wade", Age = 28 });personList.Add(new Person{ UserName="Bosh", Age=25});personList.Add(new Person { UserName = "James", Age = 29 });//現在寫法(使用集合初始化器)List<Person> newPersonList = new List<Person> { new Person{ UserName="Wade", Age=28}, new Person{ UserName="Bosh", Age=25}, new Person{ UserName="James", Age=29}};lambda表達式可以簡單地理解為:它是在匿名方法的基礎上,再進一步地簡化了創建委托實例所需要的代碼。后面會有一篇文章專門總結lambda表達式,它的語法格式為:(參數列表) => 表達式或者語句塊,下面是一個簡單的示例。
//lambda表達式var selectionPerson = newPersonList.Where(p => p.Age > 25).Select(p => p.UserName.ToUpper());foreach (var item in selectionPerson){ Console.WriteLine(item);}新聞熱點
疑難解答