1

我需要对一些代码进行排序,但是以一种奇怪的方式

我需要按非正常顺序排序,我需要先排序 40s,然后是 50s、90s、70s、80s、60s、20s、30s、10s、00s。

解决这个问题的最佳方法是什么?

它在 C#.net 3.5 中

4

3 回答 3

3

大多数排序方法都可以接受一个IComparer对象,所以如果你可以编写一个接受两个项目的方法,并且可以说出哪个在前,那么你可以使用该比较器方法进行排序。

于 2012-04-13T16:21:03.007 回答
3

您通常可以提供自定义方法来进行排序(排序方法或包含这些值的排序集合类。

或者您是在问该方法中的算法应该是什么?

对于算法,您可以使用以下方法:

int getFirstOrder(int v) {
  if (50 <= v && v <= 59) {
    return 1;
  } else if (90 <= v && v <= 99) {
    return 2;
  }
  // and so on
}

int Compare (int v1, int v2)
{
  int o1 = getFirstOrder(v1);
  int o2 = getFirstOrder(v2);

  if (o1 < o2 || (o1 == o2 && v1 < v2)) {
    return -1;
  } else if (o1 > o2 || (o1 == o2 && v1 > v2)) {
    return 1;
  } else {
    return 0;
  }
}

我确信有一种更有效的方法(尤其是对于getFirstOrder(),但这应该会让你朝着正确的方向前进

于 2012-04-13T16:21:22.333 回答
0

我最终使用了这个

private class CodeComparer : IComparer<Code>
{
    public int Compare(Code x, Code y)
    {
        var order = "4597862310";

        var bodyStyleX = x.Substring(6, 2);
        var bodyStyleY = y.Substring(6, 2);

        // Same body style group
        if (bodyStyleX[0].Equals(bodyStyleY[0]))
            return string.Compare(bodyStyleX, bodyStyleY, true);

        var indexX = order.IndexOf(bodyStyleX[0]);
        var indexY = order.IndexOf(bodyStyleY[0]);

        return indexX < indexY ? -1 : 1;
    }
}
于 2012-04-13T16:59:56.907 回答