我有一个像这样的图像名称列表{"1.jpg", "10.jpg", "2.jpg"}
。
我想像这样排序{"1.jpg", "2.jpg", "10.jpg"}
。
我创建了这个比较器。这意味着如果 x
或 y == "DSC_10.jpg"
,那么如果列表是 {"DSC_1.jpg", "DSC_10.jpg", "DSC_2.jpg", ...} 不排序并保留列表。
var comparer = new CompareImageName();
imageUrls.Sort(comparer);
return imageUrls;
public class CompareImageName : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null || y == null) return 0;
var l = x.Split('/');
var l1 = y.Split('/');
int a, b;
var rs = int.TryParse(l[l.Length - 1].Split('.')[0], out a);
var rs2 = int.TryParse(l1[l1.Length - 1].Split('.')[0], out b);
if (!rs || !rs2) return 0;
if (a == b || a == 0 && b == 0) return 0;
return a > b ? 1 : -1;
}
}
此排序正确,名称为 {"1.jpg", "10.jpg", "2.jpg"}
,但如果列表为 {"DSC_1.jpg", 则排序错误“DSC_10.jpg”,“DSC_2.jpg”,...}
。
我在 MSDN 上读到:
我的代码有什么问题吗?
最佳答案
我认为你最好为此做一些正则表达式。尝试这个解决方案:
public class CompareImageName : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null || y == null) return 0;
var regex = new Regex(@"/(((?<prefix>\w*)_)|)((?<number>\d+))\.jpg$");
var mx = regex.Match(x);
var my = regex.Match(y);
var r = mx.Groups["prefix"].Value.CompareTo(my.Groups["prefix"].Value);
if (r == 0)
{
r = int.Parse(mx.Groups["number"].Value).CompareTo(int.Parse(my.Groups["number"].Value));
}
return r;
}
}
除了正则表达式字符串本身之外,这更容易遵循逻辑。
关于c# - Icomparer c# 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44125455/