如何对编号列表进行排序[重复项]

问题描述 投票:1回答:2

此问题已经在这里有了答案:

所以我有这个编号列表,需要按数字排序:

1
1.1.
1.1.1.
1.1.2.
1.1.3.
1.1.4.
1.1.5.
1.1.6.
1.1.7.
1.2.
1.2.1.
1.2.2.
1.2.3.
1.2.4.
1.2.5.
1.2.6.
1.3.
1.3.1.
1.3.2.
1.3.3.
1.3.4.
1.4.
1.4.1.
1.4.2.
1.4.3.
1.5.
1.5.1.
1.5.2.
1.5.3.
1.6.
1.6.1.
1.6.1.1.
1.6.1.2.
1.6.2.
1.6.2.1.
1.6.2.2.
1.6.2.3.
1.6.2.4.
1.6.2.5.
1.6.2.6.
1.6.3.
1.6.3.1.
1.6.3.2.
1.6.3.3.
1.6.3.4.
1.6.3.5.
1.6.4.
1.6.5.
1.7.
1.7.1.
1.7.1.1.
1.7.1.2.
1.7.1.3.
1.7.2.
1.7.3.
1.7.4.
1.7.5.
1.7.5.1.
1.7.5.2.
1.7.6.
1.7.7.
1.7.8.
1.7.9.
1.8.
1.9.
1.10.

问题是在尝试对1.10进行排序时。将在1.2之前出现。而不是1.9之后。

任何想法我如何使用C#或linq来实现?

谢谢。

c# linq
2个回答
1
投票

您可以创建一个IComparer<T>类来帮助分类程序完成您想做的事情:

IComparer<T>

然后您可以像这样对值进行排序:

class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        string[] xParts = x.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
        string[] yParts = y.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

        for (int i = 0;;i++)
        {
            if (xParts.Length >= i && yParts.Length < i)
                return 1;
            if (xParts.Length < i && yParts.Length >= i)
                return -1;
            if (xParts.Length < i && yParts.Length < i)
                return 0;

            int compared = int.Parse(xParts[i]).CompareTo(int.Parse(yParts[i]));
            if (compared != 0)
                return compared;
        }
    }
}

-1
投票

您可以使用列表的排序方法

var sorted = values.OrderBy(s => s, new MyComparer()).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.