C#中的字符串“排序模板”

时间:2008-12-18 20:55:00

标签: c# sorting

我正试图想出一种基于“排序模板”排序一组字符串的简洁方法。如果我的措辞令人困惑,我道歉,但我想不出一个更好的方式来形容它(也许有人可以在阅读我想要做的事情之后想出一个更好的方式来描述它吗?)。

考虑以下字符串列表(我的“排序模板”,列表中的每个项目都是“命令”):

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

我想使用该列表中字符串的顺序对这些命令的列表进行排序。例如,我想要以下列表:

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

根据“排序模板”排序到以下列表中:

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

有什么好方法可以实现这个目标? 我最好的想法是使用枚举...

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

...并在列表中的每个命令上执行Enum.Parse()我想要排序,将该列表从字符串列表转换为命令列表,然后根据枚举的顺序对其进行排序

我不知道。枚举似乎会起作用,但是有更好的方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分: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)));

答案 1 :(得分: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字典中的值。

答案 2 :(得分: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

答案 3 :(得分:1)

使用命令模式(我认为它被称为)

编写一个排序方法,对列表进行排序,但使用外部方法对对象进行比较...然后将委托传递给比较方法...编写比较方法以获取两个成员list和排序模板作为输入参数...在该方法中,根据是否在模板列表中首先找到该对的第一个成员或第二个成员,返回-1,a 0或a + 1。 /> 在sort方法中,使用compare方法的返回值来实现排序,无论你做什么样的排序......