我的数组中的每个项目/字符串都以两个字母开头,后跟两个或三个数字,有时还会跟另一个字母。
示例,RS01 RS10 RS32A RS102 RS80 RS05A RS105A RS105B
我尝试使用默认的 Array.Sort 对其进行排序,但它返回了这个...
RS01
RS05A
RS10
RS102
RS105A
RS105B
RS32A
RS80
但是我需要这样的..
RS01
RS05A
RS10
RS32A
RS80
RS102
RS105A
RS105B
有什么想法吗?
最佳答案
这是使用自定义比较委托(delegate)和正则表达式进行排序:
string[] array = { "RS01", "RS10", "RS32A", "RS102",
"RS80", "RS05A", "RS105A", "RS105B" };
Array.Sort(array, (s1, s2) =>
{
Regex regex = new Regex(@"([a-zA-Z]+)(\d+)([a-zA-Z]*)");
var match1 = regex.Match(s1);
var match2 = regex.Match(s2);
// prefix
int result = match1.Groups[1].Value.CompareTo(match2.Groups[1].Value);
if (result != 0)
return result;
// number
result = Int32.Parse(match1.Groups[2].Value)
.CompareTo(Int32.Parse(match2.Groups[2].Value));
if (result != 0)
return result;
// suffix
return match1.Groups[3].Value.CompareTo(match2.Groups[3].Value);
});
更新(少量重构,并将所有内容移动到单独的比较器类)。用法:
Array.Sort(array, new RSComparer());
比较器本身:
public class RSComparer : IComparer<string>
{
private Dictionary<string, RS> entries = new Dictionary<string, RS>();
public int Compare(string x, string y)
{
if (!entries.ContainsKey(x))
entries.Add(x, new RS(x));
if (!entries.ContainsKey(y))
entries.Add(y, new RS(y));
return entries[x].CompareTo(entries[y]);
}
private class RS : IComparable
{
public RS(string value)
{
Regex regex = new Regex(@"([A-Z]+)(\d+)([A-Z]*)");
var match = regex.Match(value);
Prefix = match.Groups[1].Value;
Number = Int32.Parse(match.Groups[2].Value);
Suffix = match.Groups[3].Value;
}
public string Prefix { get; private set; }
public int Number { get; private set; }
public string Suffix { get; private set; }
public int CompareTo(object obj)
{
RS rs = (RS)obj;
int result = Prefix.CompareTo(rs.Prefix);
if (result != 0)
return result;
result = Number.CompareTo(rs.Number);
if (result != null)
return result;
return Suffix.CompareTo(rs.Suffix);
}
}
}
关于c# - 自定义数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013050/