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 完成绘制或渲染时是不是存在信号或事件?