2008-12-18 51 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)));