如何使用c#.net(MVC)实现字符串排序?
我自己在练习MVC视图,我一直在尝试使用fields如何使用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
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