如何将DataTable中的某两行记录调换顺序?

今天同事要实现一个功能:将DataTable中的某两行记录调换顺序。

试了好多种方法都不成,由于DataTable是引用类型,DataTable.Rows.Remove和DataTable.Rows.InsertAt不能用,最好把焦点锁定在table.Rows.CopyTo()上了。

网上找了大半天,基本上没有关于Rows.CopyTo的信息,没办法。自己研究吧。。。

mytable.Rows.CopyTo():智能提示显示的是:“对象复制到起始位置为给定目标数组索引的给定数组中。”

晕,一头雾水,不知所云,神马跟神马啊。。。

F12找到元数据定义:

// 摘要:
// 表示 System.Data.DataTable 的行的集合。
public sealed class DataRowCollection : InternalDataCollectionBase
{
//
// 摘要:
// 将该集合中的所有 System.Data.DataRow 对象复制到起始位置为给定目标数组索引的给定数组中。
//
// 参数:
// ar:
// 一维数组,它是从 DataRowCollection 中复制的元素的目标。该数组必须具有从零开始的索引。
//
// index:
// 复制开始时所在的数组中的从零开始的索引。
public override void CopyTo(Array ar, int index);
//
// 摘要:
// 将该集合中的所有 System.Data.DataRow 对象复制到起始位置为给定目标数组索引的给定数组中。
//
// 参数:
// array:
// 一维数组,它是从 DataRowCollection 中复制的元素的目标。该数组必须具有从零开始的索引。
//
// index:
// 复制开始时所在的数组中的从零开始的索引。
public void CopyTo(DataRow[] array, int index);
}

还是比较绕口:

将该集合中的所有 System.Data.DataRow 对象复制到起始位置为给定目标数组索引的给定数组中。

隐约觉得是将dt.Rows插入到Array这个数组的指定索引位置。

下面写一段代码来证实下我的理解是否正确


DataTable dt = new DataTable();
dt.Columns.Add(
new DataColumn("Id"));

DataRow row;

for (int i = 1; i < 11; i++)
{
row
= dt.NewRow();
row[
0] = i;

dt.Rows.Add(row);
}

foreach (DataRow r in dt.Rows)
{
Console.WriteLine(r[
0].ToString());
}

Console.WriteLine(
"-----------------------------");

DataRow x
= dt.NewRow();
x[
0] = 20;

DataRow[] rrr
= new DataRow[] { x };
DataRow[] oo
= new DataRow[] { dt.Rows[4] };
DataRow[] ar
= new DataRow[dt.Rows.Count];

dt.Rows.CopyTo(ar,
0);
rrr.CopyTo(ar,
4);
foreach (DataRow r in ar)
{
Console.WriteLine(r[
0]);
}
Console.ReadLine();

以上代码是将20插入到dt.Rows的第5个元素处,也就是Id=5的那条记录要被挤到后边去了。

细心的朋友也许会说我这段代码会报异常,因为由于20这个元素的插入使得dt.Rows数组会超出边界。确实,我也是这么认为的。
但是实际结果却令我大吃一惊。
运行结果没有异常,结果如下图:



从这个结果看来,这个方法不应该叫CopyTo而应该叫Replace才更准确。
再证实一下:
DataRow x = dt.NewRow();
x[
0] = 20;
DataRow y
= dt.NewRow();
y[
0] = 30;

DataRow[] rrr
= new DataRow[] { x, y };
DataRow[] oo
= new DataRow[] { dt.Rows[4] };
DataRow[] ar
= new DataRow[dt.Rows.Count];

dt.Rows.CopyTo(ar,
0);
rrr.CopyTo(ar,
4);
foreach (DataRow r in ar)
{
Console.WriteLine(r[
0]);
}
Console.ReadLine();
运行结果如下:


看来,这个CopyTo真是挂羊头卖狗肉,实现的是Replace的功能。

此时解决同事的问题是没什么悬念了,但是事情真的是这么个缘由吗?各位同仁如何看待呢?


posted @ 2011-05-10 16:49  microsoft_xin  阅读(2286)  评论(0编辑  收藏  举报