如何使用C#.NET(MVC)实现字符串



我正在自己练习MVC视图,我一直在尝试使用字段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>

是否有其他方法更好?

您现在拥有的对这种情况是正确的。但是,我认为您可以重组代码以使用自定义比较。换句话说,您现在的样子

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();

,但总的来说,您要做的是正确的 - 我在例如使用十进制而不是浮点 - 考虑到您期望拥有的数字作为章节数。

尝试以下:

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

最新更新