如何使用c#.net(MVC)实现字符串排序?

How to implement sort of string by using c#.net(MVC)?

我在自己练习MVC View,我一直在尝试使用字段Chapter(它是字符串类型)对数据数组进行排序。

如果我使用 orderby row.Chapter asccending,它将是

10.1
8.1
9.1

但我希望它会是

8.1
9.1
10.1

所以我一直在使用orderby float.Parse(row.Chapter) descending来达到预期的效果。

@{
    var originalRows = new[]{
        new{
            Title="Title1",
            Chapter="8.1",
            Description="NA"
        },
        new{
            Title="Title2",
            Chapter="9.1",
            Description="NA"
        },
        new{
            Title="Title3",
            Chapter="10.1",
            Description="NA"
        }
    };

    var rows =
        from row in originalRows
        orderby float.Parse(row.Chapter) descending
        select row;
}
<br />
<div>
    <table>
        <thead>
            <tr>
                <td colspan='2' style='font-weight:bold;text-align:left;'>
                    INFORMATION:
                </td>
            </tr>
        </thead>
        <tbody>
            for (var i = rows.Count(); i-->0;)
            {
                var row = rows.ElementAt(i);

                <tr>
                    <td colspan='2'>
                        <b>@(row.Title)<br /></b>
                        <b>@(row.Chapter)<br /></b>
                        <pre>@(row.Description)</pre>
                    </td>
                </tr>
            }
        </tbody>
        <tfoot>
            <tr height='0'>
                <td width='50%' style='border:none'></td>
                <td width='50%' style='border:none'></td>
            </tr>
        </tfoot>
    </table>
</div>

有没有其他更好的实现方式?

试试这个:

originalRows.OrderBy(row => decimal.Parse(row.Chapter.Replace(".",","))).ToList();

你现在所拥有的对于这种情况是正确的。但是我认为您可以重新组织代码以使用自定义比较器。换句话说,你现在拥有的看起来像

int CompareFloat(string a, string b)
{
    return float.Parse(a).CompareTo(float.Parse(b));

}

var list = new[] { "1.5.47","4.5","5.6","6.6" };

var comparer = Comparer<string>.Create(CompareFloat);

var result = list.OrderBy(i => i, comparer).ToList();

为什么要这样做?因为在这里你可以改进比较逻辑。例如。 float.Parse 将在解析 1.5.47 时失败,而使用您的自定义比较器,您可以将其更改为

int Compare(string a, string b)
{
    var aV = a.Split('.');
    var bV = b.Split('.');

    if (aV.Length != bV.Length)
        return aV.Length.CompareTo(bV.Length);

    for(var i = 0; i < aV.Length; i++)
    {
        var comparisonResult = Int32.Parse(aV[i]).CompareTo(Int32.Parse(bV[i]));

        if (comparisonResult != 0)
            return comparisonResult;
    }

    return 0;

}

var list = new[] { "1.5.47","4.5","5.6","6.6" };

var comparer = Comparer<string>.Create(Compare);

var result = list.OrderBy(i => i, comparer).ToList();

但总的来说,你所做的是正确的——我没有看到任何优势,例如使用小数而不是浮点数 - 考虑到您希望将哪些数字作为章节编号。