删除DataTable重复列,只删除其中的一列重复行的解决方法

  vs2005针对datatable已经有封装好的去重复方法:

  

复制代码 代码如下:

  //去掉重复行

  DataView dv = table.DefaultView;

  table = dv.ToTable(true, new string[] { "name", "code" });

  此时table 就只有name、code无重复的两行了,如果还需要id值则

  table = dv.ToTable(true, new string[] { "id","name", "code" });//第一个参数true 启用去重复,类似distinct

  如果有一组数据(id不是唯一字段)

  

复制代码 代码如下:

  id   name   code

  张三    123

  李四    456

  张三    456

  张三     123

  通过上面的方法得到

  

复制代码 代码如下:

  id   name   code

  张三    123

  李四    456

  张三    456

  去重复去掉的仅仅是 id name code完全重复的行,如果想要筛选的数据仅仅是name不允许重复呢?

  

复制代码 代码如下:

  table = dv.ToTable(true, new string[] { "name"});

  得到:

  

复制代码 代码如下:

  name

  张三

  李四

  但是我想要的结果是只针对其中的一列name列 去重复,还要显示其他的列

  需要的结果是:

  

复制代码 代码如下:

  id   name   code

  1    张三    123

  2    李四    456

  这个该怎么实现?下面的方法就可以,也许有更好的方法,希望大家多多指教

  

复制代码 代码如下:

  #region 删除DataTable重复列,类似distinct

  /// <summary>

  /// 删除DataTable重复列,类似distinct

  /// </summary>

  /// <param name="dt">DataTable</param>

  /// <param name="Field">字段名</param>

  /// <returns></returns>

  public static DataTable DeleteSameRow(DataTable dt, string Field)

  {

  ArrayList indexList = new ArrayList();

  // 找出待删除的行索引

  for (int i = 0; i < dt.Rows.Count - 1; i++)

  {

  if (!IsContain(indexList, i))

  {

  for (int j = i + 1; j < dt.Rows.Count; j++)

  {

  if (dt.Rows[i][Field].ToString() == dt.Rows[j][Field].ToString())

  {

  indexList.Add(j);

  }

  }

  }

  }

  // 根据待删除索引列表删除行

  for (int i = indexList.Count - 1; i >= 0; i--)

  {

  int index = Convert.ToInt32(indexList[i]);

  dt.Rows.RemoveAt(index);

  }

  return dt;

  }

  /// <summary>

  /// 判断数组中是否存在

  /// </summary>

  /// <param name="indexList">数组</param>

  /// <param name="index">索引</param>

  /// <returns></returns>

  public static bool IsContain(ArrayList indexList, int index)

  {

  for (int i = 0; i < indexList.Count; i++)

  {

  int tempIndex = Convert.ToInt32(indexList[i]);

  if (tempIndex == index)

  {

  return true;

  }

  }

  return false;

  }

  #endregion