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

Posted

技术标签:

【中文标题】DataTable.Copy() 或 DeepClone。选择哪一个?【英文标题】:DataTable.Copy() or DeepClone. Which one to choose? 【发布时间】:2012-09-26 07:35:56 【问题描述】:

我有点困惑

场景:

我想创建一个 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);
    

我的困惑:

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

【问题讨论】:

你为什么不把一个合并到另一个?我认为合并是做到这一点的方法。我在你的问题中遗漏了什么吗? msdn.microsoft.com/en-us/library/aa984388(v=vs.71).aspx 实际上我想用选择性数据表创建一个数据集副本。 @TimSchmelter:他提到了Copy 而不是Clone 也许最好使用 LINQ-To-DataSet 和 CopyToDataTable 来过滤您的 DataSet。但是,我们需要更多信息。 @CuongLe:我刚看到,谢谢。 @TimSchmelter:但CopyToDataTable 在没有要复制到数据表的数据行时容易出现异常。 msdn.microsoft.com/en-us/library/bb396189.aspx 【参考方案1】:

除非我错过了一些琐碎的事情,否则你为什么不能做类似的事情

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

【讨论】:

【参考方案2】:

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

所以在你的情况下,你可以简单地使用:-

DataTable dtCopy = dt.Copy();

或者你也可以使用:-

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

【讨论】:

以上是关于DataTable.Copy() 或 DeepClone。选择哪一个?的主要内容,如果未能解决你的问题,请参考以下文章

PHP MySql MsSql 如何插入或更新 ['] 或 ["] 或 [`] 字符?

与、或、异或运算

jQuery 或原始 JavaScript 是不是预编译或缓存变量表达式或选择器?

QGraphicsView 或 QWidget 完成绘制或渲染时是不是存在信号或事件?

KendoGrid 禁用或启用(编辑、添加或删除按钮)基础(true 或 false 中)

提供的角色不是角色、雪花或数组或角色或雪花的集合