从DataTable获取随机选择的最佳方式?

时间:2009-08-13 15:17:19

标签: .net datatable random

正如标题所说,从DataTable中随机选择x DataRows的最有效方法是什么。

是否会迭代地执行以下操作,直到我拥有所需的数量?

protected DataRow SelectRandomRow(DataTable dataTable, Random randomSelector)
{
    return dataTable.Rows[randomSelector.Next(dataTable.Rows.Count)];
}

必须有更好的方法..?

3 个答案:

答案 0 :(得分:2)

希望我的解决方案很完美...........

    Dim DT1 As New DataTable
    DT1.Columns.Add("SN1")
    DT1.Columns.Add("NAME1")
    DT1.Rows.Add("1", "Test1")
    DT1.Rows.Add("2", "Test2")
    DT1.Rows.Add("3", "Test3")
    DT1.Rows.Add("4", "Test4")
    DT1.Rows.Add("5", "Test5")
    DT1.Rows.Add("6", "Test6")
    DT1.Rows.Add("7", "Test7")
    DT1.Rows.Add("8", "Test8")
    DT1.Rows.Add("9", "Test9")
    DT1.Rows.Add("10", "Test10")
    DataGridView1.DataSource = DT1

    Dim DT2 As New DataTable
    DT2.Columns.Add("SN1")
    DT2.Columns.Add("NAME1")
    Dim I, CNT, J As Integer
    Dim RS As New Random

    While DT1.Rows.Count > 0
        CNT = DT1.Rows.Count - 1
        Try
            J = RS.Next(CNT)
            DT2.Rows.Add(DT1.Rows(J)("SN1"), DT1.Rows(RS.Next(CNT))("NAME1"))
        Catch ex As Exception
        End Try
        DT1.Rows.RemoveAt(J)
    End While
    DataGridView2.DataSource = DT2
End Sub

答案 1 :(得分:1)

您的解决方案似乎是一个非常合理的选择。

但是,您可能希望添加对要返回的重复行的检查,因为它可能会多次返回同一行。

答案 2 :(得分:1)

对于我正在研究的随机药物测试系统,我实际上回到了合格记录的查询步骤,并在结果集中添加了一个random()列作为列,并按该列排序。

选择randomFunction()作为RandSequence,其他字段来自表顺序1

由于随机是基于原始种子,并且它不会在完全相同的时间运行,同一秒,基于概率和人类感叹,它工作得很好。我对同一个“池”人群进行了50,000次查询,其中一个人群超过800人,我存储了结果。在任何给定的时间,一个人只有4次完全相同的位置,但完全基于小数精度差异。

然后,您始终可以直接从结果集中获取前X个记录。