无法随机播放DataTable的行

时间:2016-06-11 13:46:40

标签: c# visual-studio datatable

我需要随机访问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我有一些相同的行导入两次。我在这里做错了什么?

2 个答案:

答案 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();