【发布时间】:2016-10-28 22:41:50
【问题描述】:
我需要对一个场景编号列表进行排序,该列表实际上是一个字符串列表,包含数字和字母。
这是列表
101-11
102-1
101-10
101-8
103-10
101-8A
101-9
103-4
103-4B
我已经关注了一个比较器
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 firstSceneMatch = this.sceneRegEx.Match(sceneX.SceneNumber);
var firstSceneNumeric = Convert.ToInt32(firstSceneMatch.Groups[1].Value);
var firstSceneAlpha = firstSceneMatch.Groups[2].Value;
var secondSceneMatch = this.sceneRegEx.Match(sceneY.SceneNumber);
var secondSceneNumeric = Convert.ToInt32(secondSceneMatch.Groups[1].Value);
var secondSceneAlpha = secondSceneMatch.Groups[2].Value;
if (firstSceneNumeric < secondSceneNumeric)
{
return -1;
}
if (firstSceneNumeric > secondSceneNumeric)
{
return 1;
}
return string.CompareOrdinal(firstSceneAlpha, secondSceneAlpha);
}
}
这给了我以下结果
101-8
101-8A
101-9
102-1
103-4
103-4B
101-10
101-11
103-10
看起来它只是对破折号之前的第一个数字和字母数字进行排序,但它不会对破折号之后的数字进行排序以获得以下所需的结果。
101-8
101-8A
101-9
101-10
101-11
102-1
103-4
103-4B
103-10
关于如何获得所需结果的任何想法。
【问题讨论】:
-
使用“-”将字符串分割成一个元组
然后使用LINQ按Item1然后Item2排序。