c# - Icomparer c# 列表

标签 c# linq

我有一个像这样的图像名称列表{"1.jpg", "10.jpg", "2.jpg"}

我想像这样排序{"1.jpg", "2.jpg", "10.jpg"}

我创建了这个比较器。这意味着如果 xy == "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 上读到:

enter image description here

我的代码有什么问题吗?

最佳答案

我认为你最好为此做一些正则表达式。尝试这个解决方案:

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/

相关文章:

c# - 如何将 VB5 项目转换为 C# 项目

c# - 预定义文本的 .NET 语音识别

c# - 使用 Linq 从 3 个集合创建项目

C# 2005 : Remove icon from the form's title bar

c# - 修改了应用程序导出集合;枚举操作可能无法执行

c# - 更改数据捕获和 linq

c# - LINQ - C# - 使用 lambda - 从集合中获取一组数据

c# - EF linq skip/take 在哪里执行?

c# - 编译查询中的 EF.Functions.Like 无法转换为等效的 SQL

c# - 实现 if else 语句的通用方法