代码之家  ›  专栏  ›  技术社区  ›  Spyros

C#排序列表,逻辑比较

  •  2
  • Spyros  · 技术社区  · 14 年前

    我有以下问题 我有一个带有字符串的列表,例如(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,所以我更喜欢 自然数字排序不是字母排序。 我是否需要编写自己的compare类来实现ICompare接口,或者LINQ中有一个build方法来实现这个接口?

    2 回复  |  直到 14 年前
        1
  •  4
  •   LukeH    14 年前

    没有什么内置的,但如果数据是完全如你的问题,那么它应该不会太难找到一个合适的答案 Comparison<T> 为此,请执行以下操作:

    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]);
                      });
    
        2
  •  1
  •   leppie    14 年前

    拆分和比较元素,

    这是我为“版本”写的。

      /// <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;
        }
      }