本文介绍了排序章的东西像14.1.2.3和14.10.1.2.3.4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有不同深度不同章节。



所以有14.1和14.4.2和14.7.8.8.2等。



字母数字排序的14.10将14.2之前出现。那很糟。它应是14.9后。



有没有一种简单的方法来排序theese,无需添加前导零? F.E. ?使用LINQ


解决方案

 公共类NumberedSectionComparer:的IComparer<串GT; 
{
私人诠释比较(字符串[]×,字符串[] Y)
{
如果(x.Length> y.Length)
返回-compare (Y,X); //节省需要单独的逻辑。
的for(int i = 0; i = x.Length;!++我)。
{
INT CMP = int.Parse(X [I])的CompareTo(int.Parse(义]));
如果(CMP!= 0)
返回CMP;
}
返回x.Length == y.Length? 0:-1;
}
公众诠释比较(字符串x,y字符串)
{
如果(的ReferenceEquals(X,Y))//捷径
返回0;
如果(X == NULL)
返回-1;
如果(Y == NULL)
返回1;

{
收益比较(x.Split(),y.Split()'。''。');
}
赶上(FormatException)
{
抛出新的ArgumentException();
}
}
}


I've got various chapters with different depths.

so there are 14.1 and 14.4.2 and 14.7.8.8.2 and so on.

Alphanumerical sorted the 14.10 will appear before 14.2. That's bad. It should come after 14.9.

Is there an easy way to sort theese, without adding leading zeros? f.e. with linq?

解决方案
public class NumberedSectionComparer : IComparer<string>
{
  private int Compare(string[] x, string[]y)
  {
    if(x.Length > y.Length)
      return -Compare(y, x);//saves needing separate logic.
    for(int i = 0; i != x.Length; ++i)
    {
      int cmp = int.Parse(x[i]).CompareTo(int.Parse(y[i]));
      if(cmp != 0)
        return cmp;
    }
    return x.Length == y.Length ? 0 : -1;
  }
  public int Compare(string x, string y)
  {
    if(ReferenceEquals(x, y))//short-cut
      return 0;
    if(x == null)
      return -1;
    if(y == null)
      return 1;
    try
    {
      return Compare(x.Split('.'), y.Split('.'));
    }
    catch(FormatException)
    {
      throw new ArgumentException();
    }
  }
}

这篇关于排序章的东西像14.1.2.3和14.10.1.2.3.4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 00:32