正如标题所说,从DataTable中随机选择x DataRows的最有效方法是什么。
是否会迭代地执行以下操作,直到我拥有所需的数量?
protected DataRow SelectRandomRow(DataTable dataTable, Random randomSelector)
{
return dataTable.Rows[randomSelector.Next(dataTable.Rows.Count)];
}
必须有更好的方法..?
答案 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个记录。