English 中文(简体)
C#中的“排序模板”
原标题:
  • 时间:2008-12-18 20:54:59
  •  标签:

我正在尝试根据“排序模板”来整理一组字符串,我很抱歉如果我的措辞让人困惑,但我无法想到更好的描述方式(也许在阅读我所要做的事情后,有人能想出更好的描述方式呢?)。

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

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

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

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

按照“分类模板”将其归入以下列表。

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

What would be a good way to acomplish this? The best idea I have yet is to use an enumeration...

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

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

我不知道。列举似乎是可行的,但是还有更好的方法吗?

最佳回答

你可以使用一个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方法,根据它们在模板字典中的值来比较两个元素。

问题回答

这是一个非常简单的方法!

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)));

你可以像重新命名你的指令一样。

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

当您准备好使用时,请将其剥离第一个字符。我认为这被称为kludge。

我不禁想到,使用SortedList可能会有所帮助,但实际上它可能会与您的enum 差不多。

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

使用命令模式(我认为它叫做)

write a sort method that sorts the list, but uses an external method to do the comparison between pairs of objects... Then pass it a delegate to the comparison method... Write the comparison method to take two members of the list, and the sorting template as input parameters... In the method, return a -1, a 0 or a + 1 based on whether the first member of the pair or the second member is found first in the template list.
In your sort method use the return value from the compare method to implement the sort, whatever kind of sort you do...





相关问题
热门标签