iT邦幫忙

0

如何實作字串資料排序

  • 分享至 

  • xImage

正在嘗試自己練習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>
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
japhenchen
iT邦超人 1 級 ‧ 2019-08-01 15:18:41
最佳解答

用空格墊充法
.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);
        }
    }
}

不知有沒有看走眼!

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2019-08-01 15:25:29 檢舉

這也是一個方法,
其實既然已經知道範圍,
就算沒有前面的1也是一樣的意思.

anniecat iT邦新手 3 級 ‧ 2019-08-01 15:34:17 檢舉

不好意思,不知道我有沒有回應到,因為目前排序的是字串,但它是沒有範圍的內容,可能會是10.1,也可能是10.1.1.1.1.1.2.3這樣的文字,我的想像是,如果這是呈現書的章節的話,那可以怎麼實作排序比較好呢?

如果有小數,就用 parseFloat(x)

parseFloat("00000105.889") → 105.889

dragonH iT邦超人 5 級 ‧ 2019-08-01 15:41:24 檢舉

或是你直接在多個欄位叫 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
這類書冊編號上

anniecat iT邦新手 3 級 ‧ 2019-08-01 15:49:52 檢舉

有的,我原本是使用orderby float.Parse(row.Chapter) descending 但在思考有沒有其他作法?

fillano iT邦超人 1 級 ‧ 2019-08-01 16:48:33 檢舉

https://dotnetfiddle.net/CYEcIG
試寫了IComparable + Sort

我把我的方法改寫了一下,逐字墊充,這樣到前端javascript才有辦法做排序,而不是什麼都在後端預排好才送
.NET Fiddle

anniecat iT邦新手 3 級 ‧ 2019-08-02 09:53:46 檢舉

謝謝fillano與japhenchen的幫忙!
如果我這邊之後也有看到不錯的方式再放到這邊做分享~

0
小魚
iT邦大師 1 級 ‧ 2019-08-01 14:52:16

因為你是用字串,
所以10會在2的前面,
這是很正常的,
另外一種方式就是一開始就不要用字串.

看更多先前的回應...收起先前的回應...
anniecat iT邦新手 3 級 ‧ 2019-08-01 14:57:23 檢舉

謝謝小魚突破盲腸,我調整一下我問的內容~
只是現在也會好奇若是字串的狀況,可以怎麼處理更好~

小魚 iT邦大師 1 級 ‧ 2019-08-01 15:00:35 檢舉

無解,
唯一解法就是轉成數字.
如果那個欄位從一開始就只會是數字,
把它定義成文字本身就是個美麗的錯誤...

anniecat iT邦新手 3 級 ‧ 2019-08-01 15:04:38 檢舉

我重新更新問題了~謝謝~

小魚 iT邦大師 1 級 ‧ 2019-08-01 15:19:45 檢舉

所以這跟剛剛的情況有什麼不一樣嗎? XD

ant1017 iT邦新手 2 級 ‧ 2019-08-01 15:20:36 檢舉

文字的話不知道是用什麼方式來判斷順序的...ansi嗎?

小魚 iT邦大師 1 級 ‧ 2019-08-01 15:28:56 檢舉

如果是符合ASCII的應該是照ASCII的順序吧,
英文一定是 A ~ Z,
數字一定是 0 ~ 9,
中文好像有好幾種可能...

我要發表回答

立即登入回答