正在嘗試自己練習MVC的View,目前頁面上有一個陣列,其中放了三筆資料,為了呈現以Chapter
作為排序的效果,若直接使用Chapter
排序,會因為10.1的第一位為1而使它跑到第一個排序,接下來才會繼續排序8.1與9.1,但實際上希望的排序方式是8.1、9.1、10.1
,因此在LINQ中用了orderby float.Parse(row.Chapter) descending
。
想詢問除了使用此方式排序,不知道是否有更好的方式呢?
目前有在網路上看到IComparable的方法,以及Enumerable.OrderBy的方法,但有點不知道要怎麼實際應用它在我的code中呢?
@{
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>
用空格墊充法
.NET Fiddle
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> a = new List<string>();
a.Add( "1.1.1.1.10.20.30" );
a.Add( "1.1.1.1.2.3.30" );
a.Add( "1.1.1.1.10.20.31" );
a.Add( "5" );
a.Add( "1.1.1.1.10.20.32" );
a.Add( "5.2" );
a.Add( "1.1.1.1.2.21.1.1" );
a.Add( "2" );
a.Add( "3" );
a.Add( "3.1" );
// 以上為範例
// 以下這段,一樣用墊充字元的方式處理
for(int x = 0 ;x< a.Count;x++){
var ta = a[x].Split('.');
for(int i = 0 ;i< ta.Length;i++)
ta[i]=ta[i].PadLeft(10,' ');
a[x] = string.Join(".",ta);
}
a.Sort(); // 進行一般字串排序
// 以下傾印
a.Each(s=>{
Console.WriteLine(s);
});
a.Each(s=>{
Console.WriteLine(s.Replace(" ",""));
});
}
}
public static class Extensions
{ // 耍花槍,別理我
public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}
}
不知有沒有看走眼!
這也是一個方法,
其實既然已經知道範圍,
就算沒有前面的1也是一樣的意思.
不好意思,不知道我有沒有回應到,因為目前排序的是字串,但它是沒有範圍的內容,可能會是10.1,也可能是10.1.1.1.1.1.2.3這樣的文字,我的想像是,如果這是呈現書的章節的話,那可以怎麼實作排序比較好呢?
如果有小數,就用 parseFloat(x)
parseFloat("00000105.889") → 105.889
或是你直接在多個欄位叫 order 之類的
用它來排序
我用C#解答
"10.1.1.1.1.1.2.3".PadLeft(50,' ')
' '是空白字元
用空格墊在左側,最長50個字
結果是
" (34個空格)10.1.1.1.1.1.2.3"
那你用來排序,跟前面補0的方法完全相同
在前端用 str.replace(' ','') 把空白格拿掉再輸出即可
orderby float 不能使用在
10.1.1.1.1.1.2.3
這類書冊編號上
有的,我原本是使用orderby float.Parse(row.Chapter) descending
但在思考有沒有其他作法?
https://dotnetfiddle.net/CYEcIG
試寫了IComparable + Sort
我把我的方法改寫了一下,逐字墊充,這樣到前端javascript才有辦法做排序,而不是什麼都在後端預排好才送
.NET Fiddle
謝謝fillano與japhenchen的幫忙!
如果我這邊之後也有看到不錯的方式再放到這邊做分享~
因為你是用字串,
所以10會在2的前面,
這是很正常的,
另外一種方式就是一開始就不要用字串.