2012-02-16 37 views
3

我在工作中遇到了這個問題,雖然我有解決方案,但我不禁感覺有一種更優雅的方式。 List.IndexOf()的使用對我來說有點難以理解。有沒有更好的方式來訂購IEnumerable以匹配任意排序?

我必須按信用評級排序BreakdownItems的集合。信用評級不遵循字母順序,所以我將它們視爲只是具有任意的非邏輯順序。

IEnumerable<BreakdownItem> unsortedCreditRatings = new List<BreakdownItem> 
     { 
      new BreakdownItem{ Name = "CCC", Weight=20d}, 
      new BreakdownItem{ Name = "AA", Weight=20d}, 
      new BreakdownItem{ Name = "AAA", Weight=10d}, 
      new BreakdownItem{ Name = "B", Weight=50d}, 
     }; 

     var sortOrder = new List<string> 
    { "AAA", "AA", "A", "BBB", "BB", "B", "CCC", "below CCC" }; 

     var sortedRatingBreakdown = unsortedCreditRatings 
      .OrderBy(item => sortOrder.IndexOf(item.Name)); 
+1

重複字符串就像評分打開數據完整性問題的可能性。你有沒有考慮過你的評價值的枚舉? – 2012-02-16 21:56:13

+0

已經有一個枚舉了,我沒有在這裏使用它,因爲「低於CCC」不適合Enum。但問題是關於任意排序的更一般的觀點 – 2012-02-16 22:02:17

+0

因此,您希望以相同的順序將任何CCC以下的任何東西集中在一起? – 2012-02-16 22:06:55

回答

5

您可以將信用評級設爲枚舉而不是字符串嗎?然後,您可以爲這些枚舉值分配正確的排序順序。

3

正如我提到我的意見之上,具有多個信用評級作爲一個字符串可能會導致數據完整性問題,我搬完到enum代替,如:

public enum CreditRatings 
{ 
    AAA, 
    AA, 
    A, 
    BBB, 
    BB, 
    B, 
    CCC, 
    etc 
} 

你,而不是商店在你BreakdownItem,你可以這樣做:

var sortedRatingBreakdown = unsortedCreditRatings.OrderBy(item => item.Rating); 

如果必須將它們存儲爲string,並且不能使用enum你可以考慮使用Dictionary<string, int>或類似的東西來存儲您的訂購,這樣你至少可以得到O(1)查找時間:

var sortedRatingBreakdown = unsortedCreditRatings.OrderBy(item => ratingOrders[item.Name]); 
2

Enumerable.Join保留:

var ratingOrders = new Dictionary<string,int> 
    { 
     { "AAA", 1 }, 
     { "AA", 2 }, 
     { "A", 3 }, 
     etc... 
    }; 

然後你就可以在詞典的結果訂購第一個(或外部)序列的順序。如果您不喜歡枚舉方法,則可以使用此方法,而無需明確執行OrderBy

var orderedRatings = from item in sortOrder 
        join rating in unsortedCreditRatings 
        on item equals rating.Name 
        select rating; 
相關問題