c#随机化DataTable行

时间:2015-11-02 15:49:14

标签: c# datatable datasource repeater

我有一个数据表我用作转发器的数据源,并且希望每次调用时都以随机顺序显示结果。

我在检索数据时能够执行此操作,但希望在结果集绑定之前对其进行缓存。

是否要在绑定到转发器之前对数据表的行进行随机化或随机化?

CODE:

        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();
    }

感谢任何指导。

3 个答案:

答案 0 :(得分:1)

我最终拿了一份表格,添加一个字段,然后为每一行分配一个随机数,然后按该行排序。

        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();

答案 1 :(得分:0)

你可以试试这样的东西,我知道它并不漂亮,但是:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.2</version>
</dependency>

当然,您必须使用自己的表格,名称和长度,但这应该可以使用。如果有大量数据,这可能需要一段时间。这是我能想到的最好的,而且是未经测试的。我很想知道它是否有效。

答案 2 :(得分:0)

你可以尝试:

        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]);
        }

如果你的数据表不是太大,那就应该这样做。