使用 Icomparer 将小写字母排序在大写之前

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

我有一个 ListCollectionView,其中包含场景对象的集合,我需要按场景编号 (Scene.SceneNumber) 对它进行排序,场景编号是一个包含数字和字母的字符串,我需要以非常特定的顺序对其进行排序。首先按数字,然后按字母,先小写字母,然后大写字母。

列表需要如下所示:

1
1pt1
1pt2
1A
1Apt1
2
2pt1
2Apt1
3
...

这是我到目前为止所拥有的:

public class SceneComparer : IComparer
{
    private readonly Regex sceneRegEx = new Regex(@"(\d+)(\w+)?", RegexOptions.Compiled);

    public int Compare(object x, object y)
    {
        Scene sceneX = x as Scene;
        Scene sceneY = y as Scene;

        var firstSceneMatches = this.sceneRegEx.Matches(sceneX.SceneNumber);
        var secondSceneMatches = this.sceneRegEx.Matches(sceneY.SceneNumber);

        var matchesCount = Math.Min(firstSceneMatches.Count, secondSceneMatches.Count);
        for (var i = 0; i < matchesCount; i++)
        {
            var firstSceneMatch = firstSceneMatches[i];
            var secondSceneMatch = secondSceneMatches[i];

            var firstSceneNumeric = Convert.ToInt32(firstSceneMatch.Groups[1].Value);
            var secondSceneNumeric = Convert.ToInt32(secondSceneMatch.Groups[1].Value);
            if (firstSceneNumeric != secondSceneNumeric)
            {
                return firstSceneNumeric - secondSceneNumeric;
            }

            var firstSceneAlpha = firstSceneMatch.Groups[2].Value;
            var secondSceneAlpha = secondSceneMatch.Groups[2].Value;
            if (firstSceneAlpha != secondSceneAlpha)
            {
                return string.CompareOrdinal(firstSceneAlpha, secondSceneAlpha);
            }
        }
        return firstSceneMatches.Count - secondSceneMatches.Count;
     }
}

这会产生以下列表

1
1A
1Apt1
1pt1
1pt2
2
2Apt1
2pt1
...

但是我需要小写字母在大写字母之前。我该怎么做?

c# wpf sorting icomparer
1个回答
-1
投票

这应该可以完成工作

var sortedItems = items.OrderBy(x => x);

static void Main(string[] args)
{
    var items = new[] { "1pt1", "2", "2pt1","1", "1pt2", "1A", "1Apt1",  "2Apt1", "3" };

    var sortedItems = items.OrderBy(x => x);

    Console.WriteLine(string.Join(Environment.NewLine, sortedItems));
    Console.ReadKey();
}
© www.soinside.com 2019 - 2024. All rights reserved.