我需要随机访问DataTable行,因为随机访问索引在我的场景中不起作用。所以我有dt1有基础数据我必须洗牌,而dt是DataTable有洗牌数据。我的代码是:
int j;
for (int i = 0; i < dt1.Rows.Count - 1; i++)
{
j = rnd.Next(0, dt1.Rows.Count - 1);
DataRow row = dt1.Rows[j];
dt.ImportRow(row);
}
他们没有语法错误,但当我运行我的代码,我进一步访问dt我有一些相同的行导入两次。我在这里做错了什么?
答案 0 :(得分:1)
nsts = bundle.getInt("stop");
nrts = bundle.getInt("rotatoria");
ndxs = bundle.getInt("destra");
nsxs = bundle.getInt("sinistra");
只能属于一个DataRow
,使用现有DataTable
中的值创建一个新行。
DataRow
或
dt.Rows.Add(row.ItemArray);
<强>更新强>
随机化任何集合的另一种方法(来自此Link)。
dt.ImportRow(row);
现在,只需调用此扩展函数即可随机化任何集合。
public static class Extensions
{
private static Random random = new Random();
public static IEnumerable<T> OrderRandomly<T>(this IEnumerable<T> items)
{
List<T> randomly = new List<T>(items);
while (randomly.Count > 0)
{
Int32 index = random.Next(randomly.Count);
yield return randomly[index];
randomly.RemoveAt(index);
}
}
}
选中此Example
答案 1 :(得分:0)
这是我为数据表编写的扩展方法。在静态DataTableExtensions类中
public static DataTable Shuffle(this DataTable table) {
int n = table.Rows.Count;
List<DataRow> shuffledRows = new List<DataRow>();
foreach (DataRow row in table.Rows) {
shuffledRows.Add(row);
}
while (n > 1) {
n--;
int k = Random.Range(0, n + 1);
DataRow value = shuffledRows[k];
shuffledRows[k] = shuffledRows[n];
shuffledRows[n] = value;
}
DataTable shuffledTable = table.Clone();
foreach (DataRow row in shuffledRows) {
shuffledTable.ImportRow(row);
}
return shuffledTable;
}
可能不是最有效,但它可以工作。
使用:
DataTable shuffledTable = otherDataTable.Shuffle();