6

我有一个困惑

设想:

我想创建要添加到另一个 DataSet 的 DataTable 的副本。有两种方法可以做到(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还是其他一些逻辑?
4

2 回答 2

6

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

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

DataTable dtCopy = dt.Copy();

或者您也可以使用:-

DataTable dtCopy = dt.Clone();
dtCopy.Merge(dt);
于 2016-05-15T07:17:14.360 回答
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();
    }
}
于 2012-10-05T08:08:42.633 回答