【问题标题】:String "Sort Template" in C#C#中的字符串“排序模板”
【发布时间】:2009-08-27 05:22:32
【问题描述】:

我正在尝试提出一种基于“排序模板”对一组字符串进行排序的简洁方法。如果我的措辞令人困惑,我深表歉意,但我想不出更好的方式来描述它(也许有人可以在阅读我正在尝试做的事情后想出更好的方式来描述它?)。

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

  • [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(),将该列表从字符串列表转换为命令列表,然后根据枚举的顺序对其进行排序.

我不知道。枚举似乎可以工作,但有没有更好的方法可以解决这个问题?

【问题讨论】:

  • 我使用 Lambda 表达式为您发布了一个答案,可以在 1 行中完成。

标签: c# sorting


【解决方案1】:

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

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

【讨论】:

  • 我真的很喜欢 IndexOf() 的使用,我现在正在使用它。谢谢!
【解决方案2】:

您可以使用Dictionary&lt;string, int&gt; 来存储和检索您的排序模板标记。但是,这基本上与您的枚举相同(可能只是以更易读的方式),因为这里的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&lt;T&gt;.Sort 方法的适当重载来根据template 字典中的值比较两个元素。

【讨论】:

  • 是的,这就是我的想法,但我无法表达清楚(或者说:D)
【解决方案3】:

你可以像这样重命名你的命令

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

并在您准备好使用第一个字符时去掉它。我认为这叫做kludge

我不禁想到你可能会从使用 SortedList 中获得一些好处,但实际上它可能或多或少地像你的 enum 一样工作

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

【讨论】:

  • 嗯 - 我可以搜索并用前缀为数字的命令替换源列表中的每个命令,然后使用 SortedList 从那里开始......我可以试试......
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2015-08-21
    • 2016-06-08
    相关资源
    最近更新 更多