2

DataTableの既存のDataRowにデータを追加したいと思います。アイデアは、既存のデータをコピーせずにこれを行うことです。

いくつかのテストを書いているときに、データを直接挿入する方が、既存のデータと新しいデータの両方を新しい行にコピーしてその行を追加するよりもはるかに遅いことがわかりました。

それとも私はそれを間違っていますか?

まず、初期データを使用してDataTableを作成します。

初期データの入力:

DataTable table1 = new DataTable();
int count = 15;
for (int i = 0; i < count; i++)
{
    table1.Columns.Add("hallo" + i, i % 2 == 0 ? typeof(int) : typeof(string));
}
int newStartIndex = table1.Columns.Count;
DateTime pre = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
    DataRow row = table1.NewRow();
    for (int j = 0; j < table1.Columns.Count; j++)
    {
        if (j % 2 == 0)
        {
            row[j] = 502;
        }
        else
        {
            row[j] = "test";
        }
    }
    table1.Rows.Add(row);
}

その後、さらに15列とデータを追加します。

for (int i = count; i < 2 * count; i++)
{
    table1.Columns.Add("hallo" + i, i % 2 == 0 ? typeof(int) : typeof(string));
}

foreach( DataRow row in table1.Rows)
{
    for (int j = newStartIndex; j < table1.Columns.Count; j++)
    {
        if (j % 2 == 0)
        {
            row[j] = 502;
        }
        else
        {
            row[j] = "test";
        }
    }               
}

時間をかけると、データ(最初に追加されたデータとまったく同じデータである必要があります)の挿入には、最初の入力の約10倍の時間がかかることがわかります。

今、私はデータをコピーして同じことを試みました:

List<object[]> toAdd = new List<object[]>();

foreach (DataRow row in table1.Rows)
{
    object[] newArray = new object[table1.Columns.Count];
    Array.Copy(row.ItemArray, newArray, count);             
    for (int j = newStartIndex; j < table1.Columns.Count; j++)
    {
        if (j % 2 == 0)
        {
            newArray[j] = 502;
        }
        else
        {
            newArray[j] = "test";
        }
    }
    toAdd.Add(newArray);
}
table1.Rows.Clear();
foreach( var o in toAdd)
{
    table1.Rows.Add(o);
}

これは最初の充填の約2.5倍の時間がかかるため、直接挿入するよりもはるかに高速です。

どういうわけか、すべてをコピーして新しく追加するよりも、データを追加する方が速い方法があるはずだと思います。

DataRow.ItemArrayに書き込んでみましたが、DataTableに書き込んだ後、変更がDataTableに表示されません。

何か案は?そして多分この振る舞いの説明?

4

1 に答える 1

0

なぜそのような努力をしているのかはわかりませんが、おそらくあなた自身の理由があるでしょう.
ただし、正確な構文ではありませんが、次のようなものを調べましたか...

DataTable.Clone()  // to make a copy

DataTable.Merge()  // to merge one datatable all rows (w/Matching columns) into another

DataView oDV = YourDataTable.DefaultView
oDV.Filter = ...
DataTable newTable = oDV.ToTable()
于 2011-01-25T13:51:48.470 に答える