DataTable.Copy()或DeepClone。哪一个选择?

时间:2012-10-05 07:07:55

标签: c# .net datatable clone

我有困惑

情境:

我想创建一个DataTable的副本,以便添加到另一个DataSet中。有两种方法(AFAIK):

1. Make a Copy using DataTable.Copy()
2. Make a Deep Clone using 

public static T DeepClone<T>(this T source)
{
    if (!typeof(T).IsSerializable)
        throw new ArgumentException("The type must be serializable.", "source");

    // Don't serialize a null object, simply return the default for that object
    if (Object.ReferenceEquals(source, null))
        return default(T);

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    using (stream)
    {
        formatter.Serialize(stream, source);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(stream);
    }
}

我的困惑:

  1. 还有其他方法吗?
  2. 哪一个更好,为什么?
  3. DataTable.Copy()内部使用DeepClone还是其他一些 逻辑?

2 个答案:

答案 0 :(得分:3)

除非我遗漏了一些微不足道的东西,为什么你不能做像

这样的事情
DataSet source = GetMySourceDataSet();
DataSet destination = new DataSet();

DataTable orders = source.Tables["SalesOrderHeader"];

// Query the SalesOrderHeader table for orders placed  
// after August 8, 2001.
IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable modifiedOrders = query.IsAny() ? query.CopyToDataTable<DataRow>() : new DataTable();
destination.Tables.Add(modifiedOrders);

小助手

public static class Utils {
    public static bool IsAny<T>(this IEnumerable<T> data) {
        return data != null && data.Any();
    }
}

答案 1 :(得分:2)

DataTable.Copy()本身会创建数据表的深层副本,我不是在谈论DataTable.Copy()的实现,但是复制数据表的方式与它的工作方式相同,就像使用 DeepClone 复制数据,即对一个表的数据所做的更改不会影响另一个表。

因此,在您的情况下,您可以简单地使用: -

DataTable dtCopy = dt.Copy();

或者您也可以使用: -

DataTable dtCopy = dt.Clone();
dtCopy.Merge(dt);