簡體   English   中英

C#隨機化DataTable行

[英]c# Randomize DataTable rows

我有一個數據表,用作中繼器的數據源,希望每次調用時結果以隨機順序顯示。

我能夠在檢索數據時執行此操作,但希望在綁定結果集之前對其進行緩存。

在綁定到轉發器之前,是不是要對數據表的行進行混洗或隨機化?

碼:

        TreeProvider tp = new TreeProvider();
    DataSet ds = new DataSet();
    string sKey = "KEY";
    using (CachedSection<DataSet> cs = new CachedSection<DataSet>(ref ds, 5, true, null, sKey))
    {
      if (cs.LoadData)
      {
        ds = tp.SelectNodes("", "URL", "", true, "DOCTYPE", "", "NewID()", -1, true, 5);
        cs.Data = ds;
      }
    }
    if (!DataHelper.DataSourceIsEmpty(ds))
    {
      rprItems.DataSource = ds.Tables[0].DefaultView;
      rprItems.DataBind();
    }

任何指導表示贊賞。

我最終得到了該表的副本,添加了一個字段並為每行分配一個隨機數,然后按該行排序。

        DataTable dt = ds.Tables[0].Copy();
        if (!dt.Columns.Contains("SortBy"))
          dt.Columns.Add("SortBy", typeof (Int32));

        foreach (DataColumn col in dt.Columns)
          col.ReadOnly = false;

        Random rnd = new Random();
        foreach (DataRow row in dt.Rows)
        {
          row["SortBy"] = rnd.Next(1, 100);
        }
        DataView dv = dt.DefaultView;
        dv.Sort = "SortBy";
        DataTable sortedDT = dv.ToTable();

        rprItems.DataSource = sortedDT;
        rprItems.DataBind();

您可以嘗試這樣的操作,我知道它並不漂亮,但是:

DataTable newTable = new DataTable();
newTable.TableName = "<NewTableName>";
//Make a new Random generator
Random rnd = new Random();
while (<new table length> != <old table length>)
{
    //We'll use this to make sure we don't have a duplicate row
    bool rowFound = false;
    //index generation
    int index = rnd.Next(0, <max number of rows in old data>);
    //use the index on the old table to get the random data, then put it into the new table.
    foreach (DataRow row in newTable.Rows)
    {
        if (oldTable.Rows[index] == row)
        {
            //Oops, there's duplicate data already in the new table. We don't want this.
            rowFound = true;
            break;
        }
    }
    if (!rowFound)
    {
        //add the row to newTable
        newTable.Rows.Add(oldTable.Rows[index];
    }
}

當然,您必須使用自己的表,名稱和長度,但這應該可以使用。 如果數據很多,這可能需要一段時間。 這是我能想到的最好的,並且未經測試。 我很好奇它是否有效。

您可以嘗試:

        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Sort");
        dt.Rows.Add("TEST");
        dt.Rows.Add("TEST1");
        dt.Rows.Add("TEST2");

        var rnd = new Random(DateTime.Now.Millisecond);
        foreach (DataRow row in dt.Rows)
        {
            row["Sort"] = rnd.Next(dt.Rows.Count);
        }


        var dv = new DataView(dt);
        dv.Sort = "Sort";
        foreach (DataRowView row in dv)
        {
            Console.WriteLine(row[0]);
        }

如果您的數據表不是太大,那就應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM