DataTable 去除重复的问题

qq_31375515 2015-10-10 10:41:01
代码如下:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace DTS
{
class Program
{
static void Main(string[] args)
{
DataTable _dt = new DataTable();
_dt.Columns.Add("id", typeof(int));
_dt.Columns.Add("name", typeof(string));
_dt.Columns.Add("address", typeof(string));

DataRow _dr = _dt.NewRow();
_dr["id"] = 1;
_dr["name"] = "xiaodong";
_dr["address"] = "beijing";
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
_dt.Rows.Add(_dr.ItemArray);
_dr = _dt.NewRow();

_dr["id"] = 1;
_dr["name"] = "xiaodong";
_dr["address"] = "shanghai";
_dt.Rows.Add(_dr);
_dr = _dt.NewRow();


_dr["id"] = 3;
_dr["name"] = "xiaoming";
_dr["address"] = "guangdong";
_dt.Rows.Add(_dr);
_dr = _dt.NewRow();

_dr["id"] = 4;
_dr["name"] = "xudaxia";
_dr["address"] = "fujian";
_dt.Rows.Add(_dr);
_dt.Rows.Add(_dr.ItemArray);
Console.WriteLine("--------------------原来有重复数据的Table----------------------");
_dt.AsEnumerable().ToList().ForEach(
m=>
{
Console.WriteLine(m["id"].ToString() + " " + m["name"].ToString() + " " + m["address"].ToString());
});

Console.WriteLine("--------------------去除重复后的Table----------------------");
var _comPresult = _dt.AsEnumerable().Distinct(new DataTableRowCompare());
DataTable _resultDt = _comPresult.CopyToDataTable();

_resultDt.AsEnumerable().ToList().ForEach(
x =>
{
Console.WriteLine(x["id"].ToString() + " " + x["name"].ToString() + " " + x["address"].ToString());
});
Console.Read();
}
public class DataTableRowCompare: IEqualityComparer<DataRow>
{

#region IEqualityComparer<DataRow> 成员

public bool Equals(DataRow x, DataRow y)
{
return ((x.Field<int>("id") == y.Field<int>("id") && x.Field<string>("name") == y.Field<string>("name") && x.Field<string>("address") == y.Field<string>("address")));
}

public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}

#endregion
}

}
}


【我想能否把DataTableRowCompare: IEqualityComparer<DataRow>改成直接把要对比的字段以直接以字符串的形式当成一个参数来传】
比如这类里这个方法
public bool Equals(DataRow x, DataRow y)
{
return ((x.Field<int>("id") == y.Field<int>("id") && x.Field<string>("name") == y.Field<string>("name") && x.Field<string>("address") == y.Field<string>("address")));
}
是动态获取字段的,不然有的表字段很多,里面就得手动加很多进去。
比如能否直接以类似这样的形式来实现

field1,field1,field1,field1,field1,field1,field1 =>类似这样一段字符串,然后方法自动处理这个字符串,比如用split 然后自动解析这些传进来的字符串。
求大神们指教
...全文
123 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaneramn 2015-10-12
  • 打赏
  • 举报
回复
distinct。。。。。。。。。。。
md5e 2015-10-11
  • 打赏
  • 举报
回复
判断重复的依据是什么?所有字段? DataTable ndt=odt.Clone(); ndt.PrimaryKey = new DataColumn[] { ndt.Columns["id"], ndt.Columns["name"]...}; for(int i..... ... try{ ndt.Rows.Add(odt.Rows[i].ItemArray); } ....
md5e 2015-10-11
  • 打赏
  • 举报
回复
判断重复的依据是什么?所有字段?

DataTable ndt=odt.Clone();
ndt.PrimaryKey = new DataColumn[] { ndt.Columns["id"], ndt.Columns["name"]...};

for(int i.....
...
try{
ndt.Rows.Add(odt.Rows[i].ItemArray);
}
....
ajianchina 2015-10-10
  • 打赏
  • 举报
回复
你要的自定义字段参数的方式去重复 http://blog.csdn.net/ajianchina/article/details/47100251
  • 打赏
  • 举报
回复
你的思路有问题,如果你是要全部进行比较的话,dataRow有个ItemArray属性,可以通过循环调用Equals方法来进行比较,如果只要指定特定的某些列,那么别忘了你这个定义的是类,类可以有构造函数,将你要比较的列名作为一个数组传给构造函数即可,然后实现内部循环数组进行比较

62,017

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧