首页新闻找找看学习计划

datatable找出以2个字段为主键的重复数据算法

0
悬赏园豆:5 [待解决问题]

请问datatable如何找出以2个字段为主键的重复数据,求算法?

彼得林奇V5的主页 彼得林奇V5 | 初学一级 | 园豆:197
提问于:2017-12-06 12:02
< >
分享
所有回答(1)
0

算法部分:

两个字段作 Key,记录ID作Value,重复的记录会维护一个ID列表(List);

遍历完之后,List数据项大于 1 的便是有重复的记录组;

static string reRows() {
//初始化datatable
DataTable tblDatas = new DataTable("Datas");
tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));
tblDatas.Columns[0].AutoIncrement = true;
tblDatas.Columns[0].AutoIncrementSeed = 1;
tblDatas.Columns[0].AutoIncrementStep = 1;
tblDatas.Columns.Add("Product", Type.GetType("System.String"));
tblDatas.Columns.Add("Version", Type.GetType("System.String"));
tblDatas.Columns.Add("Description", Type.GetType("System.String"));
tblDatas.Rows.Add(new object[] { null, "a", "b", "c" });
tblDatas.Rows.Add(new object[] { null, "a", "b", "d" });
tblDatas.Rows.Add(new object[] { null, "a", "b", "e" });
tblDatas.Rows.Add(new object[] { null, "a", "b", "c" });
tblDatas.Rows.Add(new object[] { null, "a", "b", "e" });

//五条记录 ,(Version,Description)作主键,1,4重复;3,5重复。
//算法
Dictionary<string[], List<int>> dic = new Dictionary<string[], List<int>>(new EqualityComparer());
foreach (DataRow item in tblDatas.Rows)
{
string[] cur = new string[] { item["Version"].ToString(), item["Description"].ToString() };
if (dic.ContainsKey(cur)){
dic[cur].Add((int)item["ID"]);
}
else
{
List<int> ls = new List<int>();
ls.Add((int)item["ID"]); 
dic.Add(cur,ls);
}
}
string result = "";
foreach (var item in dic.Values)
{
if (item.Count > 1)
{
foreach (var d in item)
{
result += d+" ";
}
result += ";";
}
} 
return result;
}

 

public class EqualityComparer : IEqualityComparer<string[]>
{

public bool Equals(string[] x, string[] y)
{
return x[0] == y[0] && x[1] == y[1];
}

public int GetHashCode(string[] obj)
{
return 1;
}
}
codingHeart | 园豆:1511 (小虾三级) | 2017-12-06 15:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册