如何使用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();
但总的来说,你所做的是正确的——我没有看到任何优势,例如使用小数而不是浮点数 - 考虑到您希望将哪些数字作为章节编号。
我在自己练习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();
但总的来说,你所做的是正确的——我没有看到任何优势,例如使用小数而不是浮点数 - 考虑到您希望将哪些数字作为章节编号。