1. 程式人生 > >【轉】編寫高質量代碼改善C#程序的157個建議——建議30:使用LINQ取代集合中的比較器和叠代器

【轉】編寫高質量代碼改善C#程序的157個建議——建議30:使用LINQ取代集合中的比較器和叠代器

main tor 命名空間 span line 繼承 new each 類型

建議30:使用LINQ取代集合中的比較器和叠代器

LINQ提供了類似於SQL的語法來實現遍歷、篩選與投影集合的功能。

        static void Main(string[] args)
        {
            List<Salary> companySalary = new List<Salary>()
                {
                    new Salary() { Name = "Mike", BaseSalary = 3000, Bonus = 1000 },
                    
new Salary() { Name = "Rose", BaseSalary = 2000, Bonus = 4000 }, new Salary() { Name = "Jeffry", BaseSalary = 1000, Bonus = 6000 }, new Salary() { Name = "Steve", BaseSalary = 4000, Bonus = 3000 } }; Console.WriteLine("默認排序:"); foreach (Salary item in
companySalary) { Console.WriteLine(string.Format("Name:{0} \tBaseSalary:{1} \tBonus:{2}", item.Name, item.BaseSalary, item.Bonus)); } Console.WriteLine("BaseSalary排序:"); var orderByBaseSalary = from s in companySalary orderby s.BaseSalary select
s; foreach (Salary item in orderByBaseSalary) { Console.WriteLine(string.Format("Name:{0} \tBaseSalary:{1} \tBonus:{2}", item.Name, item.BaseSalary, item.Bonus)); } Console.WriteLine("Bonus排序:"); var orderByBonus = from s in companySalary orderby s.Bonus select s; foreach (Salary item in orderByBonus) { Console.WriteLine(string.Format("Name:{0} \tBaseSalary:{1} \tBonus:{2}", item.Name, item.BaseSalary, item.Bonus)); } } class Salary { public string Name { get; set; } public int BaseSalary { get; set; } public int Bonus { get; set; } }

foreach實際隱含調用的是集合對象orderByBaseSalary和orderByBouns的叠代器。以往,如果我們要繞開集合的Sort方法對集合按照一定的順序進行叠代,則需要讓類型繼承IEnumerable接口(泛型集合是IEnumerable<T>接口),實現一個或多個叠代器。現在從LINQ查詢生成匿名類來看,相當於可以無限為集合增加叠代需求。

我們可以利用LINQ的強大功能來簡化我們的代碼,但是LINQ功能的實現本身就是借助FCL泛型集合的比較器、叠代器、索引器的。LINQ相當於封裝了這些功能,讓我們使用起來更加方便。在命名空間System.Linq下存在很多靜態類,這些靜態類存在的意義就是為FCL的泛型集合提供擴展方法。

這條語句:

var orderByBaseSalary = from s in companySalary orderby s.BaseSalary select s;

orderby 實際就是調用了System.Linq.Enumerable類型的OrderBy方法:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    //省略
}

這是一個擴展方法,它為繼承了IEnumerable<T>接口的集合類型提供排序的功能。

強烈建議你利用LINQ所帶來的便捷性,但是我們仍需掌握比較器、叠代器、索引器的原理,以便更好的理解LINQ的思想,寫出更高質量的代碼。

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技

【轉】編寫高質量代碼改善C#程序的157個建議——建議30:使用LINQ取代集合中的比較器和叠代器