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

如何使用c#.net(MVC)实现字符串排序?,c#,asp.net-mvc,linq,visual-studio-2010,asp.net-mvc-views,C#,Asp.net Mvc,Linq,Visual Studio 2010,Asp.net Mvc Views,我自己在练习MVC视图,我一直在尝试使用fieldsChapter(它是一种字符串类型)对数据数组进行排序 如果我使用按行排序的orderby.Chapter asccending,则 10.1 8.1 9.1 8.1 9.1 10.1 但我希望是这样 10.1 8.1 9.1 8.1 9.1 10.1 因此,我一直在使用orderbyfloat.Parse(row.Chapter)降序来实现预期的效果 @{ var originalRows = new[]{ n

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

如果我使用按行排序的
orderby.Chapter asccending
,则

10.1
8.1
9.1
8.1
9.1
10.1
但我希望是这样

10.1
8.1
9.1
8.1
9.1
10.1
因此,我一直在使用
orderbyfloat.Parse(row.Chapter)降序来实现预期的效果

@{
    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>
@{
var originalRows=新[]{
新的{
Title=“Title1”,
第章=“8.1”,
Description=“NA”
},
新的{
Title=“Title2”,
第章=“9.1”,
Description=“NA”
},
新的{
Title=“Title3”,
第章=“10.1”,
Description=“NA”
}
};
变量行=
从原始行中的行
orderby float.Parse(row.Chapter)降序
选择行;
}

资料: 对于(var i=rows.Count();i-->0;) { 变量行=行。元素(i); @(行标题)
@(第行第章)
@(第行,说明) }
还有其他更好的方法吗?

试试这个:

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();
试试这个:

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

你现在所拥有的对这个案例来说是正确的。不过,我认为您可以重新组织代码以使用自定义比较器。换句话说,你现在所拥有的将是什么样子

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();
int CompareFloat(字符串a、字符串b)
{
返回float.Parse(a).CompareTo(float.Parse(b));
}
风险值列表=新[]{“1.5.47”、“4.5”、“5.6”、“6.6”};
var comparer=comparer.Create(CompareFloat);
var result=list.OrderBy(i=>i,comparer.ToList();
为什么要这样做?因为这里可以改进比较逻辑。例如,float.Parse在解析1.5.47时将失败,而使用自定义比较器可以将其更改为

int比较(字符串a、字符串b)
{
var aV=a.分割('.');
var bV=b.Split('.');
if(平均长度!=bV长度)
返回aV.Length.CompareTo(bV.Length);
对于(变量i=0;ii,comparer.ToList();

但总的来说,你所做的是正确的——我看不出使用十进制而不是浮点数有什么好处——考虑到你希望将哪些数字作为章节号。

对于这种情况,你现在所做的是正确的。不过,我认为您可以重新组织代码以使用自定义比较器。换句话说,你现在所拥有的将是什么样子

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();
int CompareFloat(字符串a、字符串b)
{
返回float.Parse(a).CompareTo(float.Parse(b));
}
风险值列表=新[]{“1.5.47”、“4.5”、“5.6”、“6.6”};
var comparer=comparer.Create(CompareFloat);
var result=list.OrderBy(i=>i,comparer.ToList();
为什么要这样做?因为这里可以改进比较逻辑。例如,float.Parse在解析1.5.47时将失败,而使用自定义比较器可以将其更改为

int比较(字符串a、字符串b)
{
var aV=a.分割('.');
var bV=b.Split('.');
if(平均长度!=bV长度)
返回aV.Length.CompareTo(bV.Length);
对于(变量i=0;ii,comparer.ToList();

但总的来说,您所做的是正确的-我不认为使用十进制而不是浮点有任何好处-考虑到您希望将哪些数字作为章节号。

似乎工作正常,我建议使用OrderBy重载,它接受IComparer并在那里添加比较器。因为我可以想象章节号可以包含任意数量的点,例如1.45.3等,并且使用自定义比较器可以定义排序顺序easily@Viktor阿尔萨诺夫我想你提到的方法可能是我想要的,但我不知道如何在我的案例中使用它。因为我没有其他字段可以与章节进行比较。“也许我想错了?”安妮,我认为你做得对;现在你做的很好;我的回答是关于未来的改进。关于要比较的字段和自定义比较器-我的意思是,如果您将章节作为以点分隔的数字集,那么您可以将其拆分并逐个比较。副本将向您显示
版本
类型。将您的
章节
存储为
版本
,然后您可以根据原始行中的
var rows=from row按行排序对其进行排序。章节升序选择行。似乎工作正常,我建议使用OrderBy重载,它接受IComparer并在那里添加comparer。因为我可以想象章节号可以包含任意数量的点,例如1.45.3等,并且使用自定义比较器可以定义排序顺序easily@Viktor阿尔萨诺夫我想你提到的方法可能是我想要的,但我不知道如何在我的案例中使用它。因为我没有其他字段可以与章节进行比较。“也许我想错了?”安妮,我认为你做得对;现在你做的很好;我的回答是关于未来的改进。关于要比较的字段和自定义比较器-我的意思是,如果您将章节作为以点分隔的数字集,那么您可以使用spl