2013-04-27 49 views
3

所以我有一個被稱爲myDeliverableList.Orderby在C#中第一排序依據數字,甚至ASC那麼相同數量的奇數decending

myDeliverable包含對象稱爲Buyer名單。 買家有string streetint housenumber

現在我要訂購首先由街道按字母順序排列,然後由門牌號被甚至從0,1,2,3..n上升,然後是奇數decending的housenumbers 。所以輸出應該是這樣的:

AAstreet 2 
AAstreet 10 
AAstreet 12 
AAstreet 20 
AAstreet 13 
AAstreet 9 
AAstreet 1 
BAstreet 4 
BAstreet 8 
BAstreet 3 
(...) 

所以我寫了follwing:

myDeliverables = myDeliverables 
     .OrderBy(x => x.Buyer.Street) 
     .ThenBy(x => x.Buyer.Housenumber).Where(x => x.Buyer.Housenumber % 2 == 0) // even 
     .ThenBy(x => x.Buyer.Housenumber).Where(x => x.Buyer.Housenumber % 2 != 0) // odd 
     .ToList(); 

VS吉文斯我有錯誤.ThenBy(x => x.Buyer.Housenumber說着什麼東西沒有一個.ThenBy方法。我假設我不得不在最後做些什麼..不知道該怎麼做,以前沒有用過linq。

回答

5

問題是,當您撥打.Where它實際上是過濾列表中的元素 - .Where(x.Buyer.HouseNumber % 2 == 0)將離開你只有甚至門牌號碼。它在.ThenBy上拋出一個編譯時錯誤,因爲Linq在某種意義上已經「忘記」列表已被排序。但即使情況並非如此,.Where(x.Buyer.HouseNumber % 2 != 0)將過濾甚至門牌號碼。所以,即使你的排序工作,你會留下一個空的列表。

您首先需要按號碼的奇偶性(無論是偶數還是奇數)排序,然後是。您可以使用奇偶校驗來決定是升序還是降序。

試試這個:

myDeliverables = myDeliverables 
    .OrderBy(x => x.Buyer.Street) 
    .ThenBy(x => x.Buyer.Housenumber % 2) // parity 
    .ThenBy(x => x.Buyer.Housenumber % 2 == 0 
       ? x.Buyer.Housenumber  // evens ascending 
       : -x.Buyer.Housenumber)  // odds descending 
    .ToList(); 
+0

非常感謝,但納悶,爲什麼不呢? 'myDeliverables = myDeliverables .OrderBy(X => x.Buyer.Street) .ThenBy(X => x.Buyer.Housenumber%2 == 0) .ThenByDescending(X => x.Buyer.Housenumber% 2!= 0) .ToList();' 這是一樣的權利? – ganjan 2013-04-27 16:22:58

+0

@ganjan這是不一樣的。 ** 1)**'。ThenBy(x.Buyer.Housenumber%2 == 0)'將按奇偶性排序,但首先是奇數(因爲在排序時false 2013-04-27 16:49:55