我有一个 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
...
但是我需要小写字母在大写字母之前。我该怎么做?
这应该可以完成工作
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();
}