首页 > 解决方案 > 如何在 c# 中使用 OrderBy() 函数允许多种元素位置格式?

问题描述

在我的 wpf 应用程序中,我有一个列表视图,其中包含我希望能够编写以下格式的位置属性的元素:1、2、3;1a、1b、1c;1)a), 1)b), 1)c); 1.1、1.2、1.3;

这些位置属性是字符串类型,我想按大小和子步骤自动对它们进行排序。

我试过这个:

public class ClassXY
{
    public string Position;
}

ObservableCollection<ClassXY> _myCollection = new ...;
_myCollection.OrderBy(p => p.Position);
_myCollection.OrderBy(p => Convert.ToDouble(p.Position));

当然这对我不起作用,任何格式的子步骤总是在最后添加。有没有办法做到这一点而无需完全自己做?

标签: c#

解决方案


如果有人对我如何解决问题感兴趣:我使用了此处找到的解决方案 如何在字符串为数字时按字母顺序对字符串进行排序同时考虑值?

它对我的目的很好。

ObservableCollection<ClassXY> _myCollection = new ...;
_myCollection.OrderBy(p => p.Position, new SemiNumericComparer());

public class SemiNumericComparer : IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        if (IsNumeric(s1) && IsNumeric(s2))
        {
            if (Convert.ToDouble(s1) > Convert.ToDouble(s2)) return 1;
            if (Convert.ToDouble(s1) < Convert.ToDouble(s2)) return -1;
            if (Convert.ToDouble(s1) == Convert.ToDouble(s2)) return 0;
        }

        if (IsNumeric(s1) && !IsNumeric(s2)) { return -1; }
        if (!IsNumeric(s1) && IsNumeric(s2)) { return 1; }
        return string.Compare(s1, s2, true);
    }

    public static bool IsNumeric(object value)
    {
        try
        {
            var i = Convert.ToDouble(value.ToString());
            return true;
        }
        catch (FormatException)
        {
            return false;
        }
    }
}

推荐阅读