日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
輕輕松松學(xué)習Linq排序

Linq排序在一系列Linq操作中應(yīng)該使用頻率***的,關(guān)于Linq排序的文章也很多,但是筆者的這篇文章最值得一讀了,因為他把理論與實踐結(jié)合的十分***,理解起來也很簡單,希望能給你帶來幫助。

阿榮網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

在程序開發(fā)中,對數(shù)據(jù)進行排序是很常見的操作?,F(xiàn)在就來演示一下Linq排序,假設(shè)現(xiàn)在有一個類Customer,定義如下所示:

 
 
 
  1. public class Customer
  2. {
  3. public string Id { get; set; }
  4. public string Name { get; set; }
  5. public decimal Age { get; set; }
  6. }

我們現(xiàn)在要對很多Customer對象進行排序,最簡單的就是使用Linq排序的orderby子句:

 
 
 
  1. from c in Customers orderby c.Id select c;

上面實現(xiàn)了按照Id來進行Linq排序。可是需求變了,用戶現(xiàn)在想用Name來排序。好辦!把上面的改一改比如下面這樣就可以了:

 
 
 
  1. from c in Customers orderby c.Name select c;

可是需求又變了,用戶現(xiàn)在說,你在程序中不能寫死,得列一個菜單,我點哪個你就按哪個給我Linq排序。這個也不難辦:

 
 
 
  1. var searchResult = from c in Customers select c;
  2. if (columnName == "Id")
  3. {
  4. searchResult = from c in Customers orderby c.Id select c;
  5. }
  6. else if (columnName == "Name")
  7. {
  8. searchResult = from c in Customers orderby c.Id select c;
  9. }
  10. else ...

這確實解決了問題,可是這樣的代碼不易維護。如果加屬性了怎么辦?如果屬性改名字了怎么辦?如果有好多的不同的類都需要這樣的Linq排序怎么辦?

下面我介紹一種較為通用的解決方案,此方案的核心技術(shù)是反射(Reflection)和擴展方法(Extension Methods)。

 
 
 
  1. public static IOrderedQueryable  OrderBy (  
  2. this IQueryable  source,  
  3. Expression > keySelector,  
  4. IComparer  comparer  
  5. )

參數(shù)source是一個用來排序的對象,keySelector是用來取出用來Linq排序的鍵的函數(shù),comparer(比較器)用來比較取出的兩個鍵值。

對象的屬性類型可能多種多樣,而我們又不想為每種類型分別指定comparer(因為那樣做的話也將是一堆if else…)。變通一下思路,不管遇到哪種類型的屬性,我們都先把它的值放到一個共同的容器中,然后為這個容器寫一個comparer類。我們把類型判斷留到了這個comparer中,因為類型是有限的,至少我們需要處理的那些屬性的類型是有限的。
上面提到的這個值的容器也是一個類,定義如下:

 
 
 
  1. public class CommonComparableValue
  2. {
  3. public object RealValue { get; set; }
  4. }

相應(yīng)的比較類定義如下:

 
 
 
  1. public class CommonComparableValueComparer : IComparer  
  2. {
  3. public int Compare(CommonComparableValue x, CommonComparableValue y)
  4. {
  5. string s = x.RealValue as string;
  6. if (s != null)
  7. {
  8. return s.CompareTo(y.RealValue);
  9. }
  10. int? i = x.RealValue as int?;
  11. if (i != null)
  12. {
  13. return i.Value - (int)y.RealValue;
  14. }
  15. decimal? d = x.RealValue as decimal?;
  16. if (d != null)
  17. {
  18. return d.Value.CompareTo((decimal)y.RealValue);
  19. }
  20. throw new NotImplementedException("NotImplemented Data Type!!!");
  21. }
  22. }

這里的比較類只用到了int,string等幾種類型,如果屬性有其它的類型,也應(yīng)該在這里添加。從代碼實現(xiàn)可以看出,即使屬性的類型是復(fù)雜數(shù)據(jù)類型也可以這么處理。

現(xiàn)在來看keySelector的實現(xiàn)。它是用來取出待比較的屬性值的函數(shù)。這個函數(shù)應(yīng)該是這個樣子的:

 
 
 
  1. public delegate TResult Func  
  2. ( T  arg )

在這里,T的類型就是Customer,TResult就是剛剛已經(jīng)那個存放任意屬性類型的值的容器CommonComparableValue。

在這個實現(xiàn)取鍵值的函數(shù)里,我們只有一個Customer類型的參數(shù)arg可用,而那個用來Linq排序的屬性名字是在運行期間確定的,如何才能取出我們想要的屬性的值呢?方法是這樣的,先通過擴展方法為Customer加一個名為GetSortingKeyValue的取鍵值方法,代碼如下:

 
 
 
  1. public static class CustomerSortExtension
  2. {
  3. public static CommonComparableValue GetSortingKeyValue(this Customer ainfo, string columnName)
  4. {
  5. Type t = ainfo.GetType();
  6. PropertyInfo pinfo = t.GetProperty(columnName);
  7. if (pinfo == null)
  8. {
  9. throw new Exception("Property " + columnName + "not found");
  10. }
  11. else
  12. {
  13. return new CommonComparableValue
  14. {
  15. RealValue = pinfo.GetValue(ainfo, null)
  16. };
  17. }
  18. }
  19. }

這里就是通過一個字符串獲取屬性值,核心是反射。接下來只要在那個keySelector方法中調(diào)用GetSortingKeyValue方法就可以了。

到這里,各種準備活動就做完了?,F(xiàn)在來看一下怎么把這些東西組織起來實現(xiàn)Linq排序:

 
 
 
  1. var searchResult = from c in Customers select c;
  2. Func  myFunc = x => x.GetSortingKeyValue(columnName);  
  3. CommonComparableValueComparer comparer = new CommonComparableValueComparer();
  4. searchResult = searchResult.OrderBy(myFunc, comparer);

這種方案的主要內(nèi)容到這里就介紹完了。

***提一下,如果你想把這些東西用到你的代碼中,你一般需要做的只有:將擴展方法的***個參數(shù)改為你需要Linq排序的那個類型。比如要為Person排序,擴展方法則可以是這個樣子:

 
 
 
  1. public static CommonComparableValue GetSortingKeyValue(this Customer ainfo, string columnName)

當然,那個CommonComparableValueComparer類也應(yīng)該根據(jù)實際類型修改以支持更多的屬性類型。

以上就是對Linq排序的詳細介紹,從理論到方法,很有價值的一篇文章呦!


本文名稱:輕輕松松學(xué)習Linq排序
鏈接URL:http://www.dlmjj.cn/article/cdchsod.html