从数据表中选择一个随机记录

时间:2015-06-18 06:38:32

标签: c# random datatable

我正在尝试创建一个导入excel文件并从中读取数据的应用程序,它根据用户想要从该列表中获得多少获胜者随机返回 n 记录作为获胜者。所以我从excel文件中读取数据并将其分配给名为datatable的{​​{1}}。这是一个小概述

enter image description here

表示excel中将导入dt的前30条记录。现在,如果10中的用户密钥(即获胜者总数),我需要从这个dt中挑选10个“RANDOMLY”获胜者,但正如您所看到的那样,其中一些是重复的,例如:在D栏中,名为“H”的条目有6行。现在,如果应用程序选择其中一个,则必须删除其他“H”,但这是在它被选中之后。在选择任何副本之前删除重复项,将降低他们赢得更好奖品的机会。

1 个答案:

答案 0 :(得分:1)

你可以尝试一下吗,

dt2 = dt.Clone();
dt.AsEnumerable().Select(x => x["IC_NUMBER"].ToString()).Distinct().ToList().ForEach(x =>
{
    DataRow[] dr = dt.Select("IC_NUMBER = '" + x + "'");
    dt2.ImportRow(dr[0]);
    dr.ToList().ForEach(y => dt.Rows.Remove(y));
    dt.AcceptChanges();
});

编辑:

int totalWinners = 10;
Random rnd = new Random();
dt2 = dt.Clone();
for (int i = 1; i <= totalWinners; i++)
{
    //Pick random datarow
    DataRow selectedWinner = dt.Rows[rnd.Next(0, dt.Rows.Count - 1)];
    //Insert it in the second table
    dt2.ImportRow(selectedWinner);
    //Retrieve other datarows that have same 'IC NUMBER'
    var rows = dt.AsEnumerable().Where(x => x["IC NUMBER"].ToString() ==
                                            selectedWinner["IC NUMBER"].ToString());
    //Delete all the rows with the selected IC NUMBER in the first table
    rows.ToList().ForEach(y => dt.Rows.Remove(y));
    dt.AcceptChanges();
}

希望这会有所帮助......