2008-12-18 111 views
4

我試圖想出排序基於「排序模板」一組字符串的清潔方式。我很抱歉,如果我的措辭是混亂的,但我想不出更好的方式來描述它(也許有人能想出更好的辦法讀什麼,我試圖做後形容呢?)。字符串「排序模板」,在C#

考慮串名單如下(我 「之類的模板」,在列表中的 「命令」 每個項目):

  • [FA,TY,AK,PO,PR,ZZ,QW,BC ]

我想使用該列表中的字符串順序來排序這些命令的列表。例如,我想下面的列表:

  • [TY,PR,PR,ZZ,BC,AK]

到基於 「排序模板」 可以分爲以下列表:

  • [TY,AK,公關,公關,ZZ,BC]

什麼將是acomplish這是一個好辦法嗎? 我還沒有最好的辦法是使用一個枚舉...

enum Command 
{ 
    FA, 
    TY, 
    AK, 
    PO, 
    PR, 
    ZZ, 
    QW, 
    BC 
}; 

...並在我的名單我想排序每個命令做一個Enum.Parse(),轉換該列表從列表將字符串轉換爲命令列表,然後根據枚舉的順序對其進行排序。

我不知道。枚舉看起來好像會起作用,但有沒有更好的辦法可以解決這個問題?

+0

我發佈了一個使用Lambda表達式的答案,可以在1行中完成。 – 2008-12-18 21:35:59

回答

2

你可以使用一個Dictionary<string, int>來存儲和檢索排序模板標記。然而,這基本上是使用相同的枚舉(僅在一個稍微更可讀的方式也許),因爲這裏Enum.Parse可能會造成混亂。

var ordering = Dictionary<string, int>(); 
ordering.Add("FA", 0); 
ordering.Add("TY", 1); // … 

MyList.Sort((a, b) => ordering[a].CompareTo(ordering[b])); 

這使用List<T>.Sort方法的適當的過載來比較根據它們在字典template值的兩個元素。

+0

這是完美的,它的工作原理大!非常感謝你! – 2008-12-18 21:12:57

+0

是的,這是我在想什麼,但我不能完全表達它(或做到這一點:D) – inspite 2008-12-18 21:15:34

1

你可以重命名命令,如

[1FA, 2TY, 3AK, 4PO, 5PR, 6ZZ, 7QW, 8BC] 

並去掉第一個字符,當你準備使用它。我認爲這就是所謂的kludge

我不禁想到你可能會得到一些里程從使用的SortedList,但實際上它想必會工作或多或少像你enum

SortedList Commands = new SortedList(); 
Commands.Add(1,FA); 
Commands.Add(2,TY); 
//etc 
+0

嗯 - 我可以用一個前綴爲數字的命令搜索並替換源列表中的每個命令,然後使用SortedList從那裏...我可以試試這個... – 2008-12-18 21:05:36

1

使用Command模式(我認爲這就是所謂的)

寫對列表進行排序,而是使用一個外部的方法做對的對象之間的比較的排序方法...然後將它傳遞一個委託給比較方法......寫的比較法採取的兩名成員列表和排序模板作爲輸入參數...在該方法中,返回-1,a 0或a + 1 b取決於模板列表中是否首先找到該對中的第一個成員或第二個成員。
在你的排序方法使用來自比較方法的返回值來實現排序,無論那種你做那種......

3

這是一個非常簡單的方法來做到這一點!

List<string> template = new List<string>{ "ZD", "AB", "GR"}; 

List<string> myList = new List<string>{"AB", "GR", "ZD", "AB", "AB"}; 
myList.Sort((a, b) => template.IndexOf(a).CompareTo(template.IndexOf(b)));