代码之家  ›  专栏  ›  技术社区  ›  Galwegian

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

  •  0
  • Galwegian  · 技术社区  · 17 年前

    正如标题所说,从数据表中随机选择x个数据行最有效的方法是什么。

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

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

    一定有更好的办法。。?

    3 回复  |  直到 17 年前
        1
  •  2
  •   VIJAY P    15 年前

    希望我的解决方案是完美的。。。。。。。。。。。

        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
    
        2
  •  1
  •   Reed Copsey    17 年前

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

        3
  •  1
  •   DRapp    17 年前

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

    选择randomFunction()作为RandSequence,表中的其他字段按1排序

    由于随机是基于原始种子的,它不会在完全相同的时间,相同的秒运行,基于概率和人类的感叹,它工作得很好。我对同一“群体”的人进行了50000次的查询——其中一个群体有800多人,我存储了结果。在任何给定的时间里,一个人只有4次处于完全相同的位置,但完全基于十进制精度差。

    然后,您总是可以直接从结果集中获取前X条记录。