[ADO.NET]在 DataTable(DataSet) 亂數排序

[ADO.NET]在 DataTable(DataSet) 亂數排序

前段時間有各小功能系統(ASP.NET 2.0),讀取XML的資料來源,都一直順利的運作,
突然客戶要求排序要每一次都動態亂數(Random)排序,就在想說是不是能在將XML讀取到
DataTable 後,在作亂數排序,就到 MSDN FORUM 搜尋一下,很幸運的找到這篇
回覆:DataTable/DataView可以進行隨機的排序嗎?小朱 與  chhuang 提出很好的作法,

我就把這個範例整理出來, 運用在這個情境上,
狀況是有一個類似這樣的 XML 資料
 

<?xml version="1.0" encoding="utf-8"?>
	<channel>		 
		<item>
			<ID>1</ID>
			<title>Azure 服務平台 中文版網站正式上線</title>			 
		</item>
		<item>
			<ID>2</ID>		
			<title>2009 年 1 月份 MSDN 研討會:從伺服器到雲端 – 在雲端運算中重複使用您的技能</title>		 
		</item>
		<item>
			<ID>3</ID>		
			<title>Silverlight 應用範例 : 台北市民管樂團</title>		 
		</item>
		<item>
			<ID>4</ID>
			<title>Silverlight/XNA 修練大會正式開始</title>			 
		</item>
		<item>
			<ID>6</ID>
			<title>搶先下載 Internet Explorer 8</title>		 
		</item>		
	</channel>
 

在沒有加入亂數排序的狀況下程式碼如下 :
 

  protected void Page_Load(object sender, EventArgs e)
    {
        FillRepeater();
    }
    private void FillRepeater()
    {        

        DataSet dsData = new DataSet();
        dsData.ReadXml(Server.MapPath("XMLFile2.xml"));
        DataTable dta = dsData.Tables[0];
        Repeater1.DataSource = dta;
        Repeater1.DataBind();
    }

呈現出來的結果,當然就是按照XML檔案裡面的資料依序排出
image
 

而這個案例中,需要能夠每次都亂數排序,所以可以從 DataTable 下手,
步驟是
1.在目前資料的DataTable中,加入一個數字欄位
2.按多少列資料,依序給予一個亂數值
3.將目前的DataTable 給到 DataView
4.針對 DataView 下排序指令 ( 排序剛亂數產生的欄位)
 

 private void FillRepeater()
    {        

        DataSet dsData = new DataSet();
        dsData.ReadXml(Server.MapPath("XMLFile2.xml"));
        DataTable dta = dsData.Tables[0];
        //1.加入一個亂數數字欄位
        dta.Columns.Add("RowID", typeof(int));
        Random r = new Random();
        //2/查出目前有多少列資料,就補上亂數欄位 
        foreach (DataRow row in dta.Rows)
        {
            row["RowID"] = r.Next(0, 100);
        }
        //透過將 DataTable 加入至 DataView
        DataView view = new DataView(dta);
        //針對 DataView 下 Sort 條件
        view.Sort = "RowID DESC";
        //再將以經亂數排序的DataView 給 Control
        Repeater1.DataSource = view;
        Repeater1.DataBind();
    }

執行這段亂數版本的,就會看到以下的變化
image 
從上面這個範例中,就可以知道不管資料來源是什麼,當資料到 ADO.NET DataTable (DataSet) ,
當無法在資料來源時下隨機排序時,就可以在 ADO.NET DataTable 增加一個欄位的方式,
來做隨機排序的功能,所以不管是哪一種Control 像範例中的 Repeater 或 DataGrid ,GridView ,DataList ,
資料來源都是同一種DataTable,都依這個方式就能達成一樣的效果。

 

參考資料: 
 回覆:DataTable/DataView可以進行隨機的排序嗎?( 這篇討論中還有其他值得參考的資訊,推薦大家可以去看)