如何比较两个"数字"与多个点?

Ken*_*nci 2 c#

我有一个无序列表,看起来像这样:

1
2.2
1.1.1
3

当我对列表进行排序时,1.1.1变得大于3和2.2,而2.2变得大于3.

这是因为Double.Parse删除了点并使其成为整数.

这是我用来排序的方法:

public class CompareCategory: IComparer<Category>
{
    public int Compare(Category c1, Category c2)
    {
        Double cat1 = Double.Parse(c1.prefix);
        Double cat2 = Double.Parse(c2.prefix);

        if (cat1 > cat2)
            return 1;
        else if (cat1 < cat2)
            return -1;
        else
            return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?谢谢

Joh*_*hnD 12

这些版本#s是偶然的吗?你可以使用Version?它按照您的需要对每个部件进行排序,尽管它最多只能处理4个部件.我不建议像你一样解析成数值.

它有一个IComparable界面.假设您的输入是字符串,这里是一个示例:

public class CompareCategory: IComparer<Category>
{
    public int Compare(Category c1, Category c2)
    {
        var cat1 = new Version(c1.prefix);
        var cat2 = new Version(c2.prefix);

        if (cat1 > cat2)
            return 1;
        else if (cat1 < cat2)
            return -1;
        else
            return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你需要超过4个"部分"的东西,我想我会创建一个比较器,它将字符串分成点,然后将每个元素解析为整数并用数字进行比较.请务必考虑1.002.3和1.3.3之类的情况(您希望排序顺序是什么?).

更新,这是我的意思的样本.轻微测试:

    public class CategoryComparer : Comparer<Category>
    {
        public override int Compare(Category x, Category y)
        {
            var xParts = x.prefix.Split(new[] { '.' });
            var yParts = y.prefix.Split(new[] { '.' });

            int index = 0;
            while (true)
            {
                bool xHasValue = xParts.Length > index;
                bool yHasValue = yParts.Length > index;
                if (xHasValue && !yHasValue)
                    return 1;   // x bigger
                if (!xHasValue && yHasValue)
                    return -1;  // y bigger
                if (!xHasValue && !yHasValue)
                    return 0;   // no more values -- same
                var xValue = decimal.Parse("." + xParts[index]);
                var yValue = decimal.Parse("." + yParts[index]);
                if (xValue > yValue)
                    return 1;   // x bigger
                if (xValue < yValue)
                    return -1;  // y bigger
                index++;
            }
        }
    }
    public static void Main()
    {
        var categories = new List<Category>()
        {
            new Category { prefix = "1" },
            new Category { prefix = "2.2" },
            new Category { prefix = "1.1.1" },
            new Category { prefix = "1.1.1" },
            new Category { prefix = "1.001.1" },
            new Category { prefix = "3" },
        };

        categories.Sort(new CategoryComparer());
        foreach (var category in categories)
            Console.WriteLine(category.prefix);
    }
Run Code Online (Sandbox Code Playgroud)

输出:

1
1.001.1
1.1.1
1.1.1
2.2
3
Run Code Online (Sandbox Code Playgroud)