C#排序列表,逻辑比较

时间:2010-07-01 12:10:32

标签: c# linq list compare

我有以下问题 我有一个包含字符串的列表,例如(100_1,100_2 ......,100_10)

我使用以下代码对列表进行排序

extraImgsRaw.Sort((photo1, photo2) => photo1.CompareTo(photo2));

结果是:100_1,100_10,100_2,100_3等等

我想要的结果是逻辑比较,如100_1,100_2然后100_10所以我更喜欢a 自然数字排序不是字母排序。 我是否需要编写自己的实现ICompare接口的比较类,或者在LINQ中有一个构建方法可以做到这一点吗?

提前谢谢

2 个答案:

答案 0 :(得分:4)

没有任何内置内容,但如果数据与您的问题中显示的完全一致,那么为您执行此操作可能不会太困难{<3}}:

extraImgsRaw.Sort((x, y) =>
                  {
                      // error checking etc removed for brevity
                      int[] xi = x.Split('_').Select(int.Parse).ToArray();
                      int[] yi = y.Split('_').Select(int.Parse).ToArray();

                      int c = xi[0].CompareTo(yi[0]);
                      return (c != 0) ? c : xi[1].CompareTo(yi[1]);
                  });

答案 1 :(得分:1)

拆分和比较元素,

这是我为'版本'写的一篇。

  /// <summary>
  /// Only works for version numbers in the form a ( . b ( . c ( . d )? )? )?
  /// </summary>
  public class VersionComponents : IComparable<VersionComponents>
  {
    readonly int[] components;

    int[] GetComponents(string cpnumber)
    {
      var tokens = cpnumber.Split(".".ToCharArray(), 
                                   StringSplitOptions.RemoveEmptyEntries);
      return tokens.Select(x => Convert.ToInt32(x)).ToArray();
    }

    public VersionComponents(string cpnumber)
    {
      components = GetComponents(cpnumber);
    }

    public int this[int index]
    {
      get { return components.Length > index ? components[index] : 0; }
    }

    public int CompareTo(VersionComponents other)
    {
      for (int i = 0; i < components.Length || 
                      i < other.components.Length; i++)
      {
        var diff = this[i].CompareTo(other[i]);
        if (diff != 0)
        {
          return diff;
        }
      }

      return 0;
    }
  }