查找重复条目 C#
本文关键字:查找 | 更新日期: 2023-09-27 18:35:44
我是编程新手,所以这似乎有些简单,但我似乎无法弄清楚。
我正在尝试在一列值中找到数据表中的重复值。
这就是我试图做的。
DataRow[] dupresults = dt.Select("PROV_NEW");
TableIssues = string.Empty;
DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV");
if (dupresults.Length == 0)
{
return true;
}
else
{
foreach (DataRow item in dupresults)
{
Console.WriteLine(item[1]);
TableIssues += "Provider Code is not unique for " + item[1].ToString() + ". Revise non-unique codes.'r'n'n'n'n";
}
return false;
}
好的,但我也在搜索它以确保PROV_NEW中也没有空字段。 所以我不知道把它放在哪里。我对 c# 很陌生。我上周刚开始。我正在为我父亲的公司做副业。
private bool ValidateTable(DataSets.Setup.SETUP_MWPROVDataTable dt, out string TableIssues)
{
try
{
//NewCode not used for other row
DataRow[] result = dt.Select("PROV_NEW = ''");
DataRow[] dupresults = dt.Select("PROV_NEW");
TableIssues = string.Empty;
DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV");
if (dupresults.Length == 0)
{
return true;
}
else
{
var duplicates = dt.AsEnumerable()
.Select(dr => dr.Field<string>("PROV_NEW"))
.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.ToList();
foreach (DataRow item in dupresults)
{
Console.WriteLine(item[1]);
TableIssues += "Provider Code is not unique for " + item[1].ToString() + ". Revise non-unique codes.'r'n'n'n'n";
}
return false;
}
if (result.Length == 0)
{
//TODO: Add Next Step for validation
return true;
}
else
{
foreach (DataRow item in result)
{
Console.WriteLine(item[1]);
TableIssues += "Provider code " + item[1].ToString() + " is blank. Add new Provider code for " + item[1].ToString() +".'r'n'n'n";
}
return false;
}
}
catch (Exception)
{
throw;
}
}
}
LINQ 可以在这里为您提供帮助:
var duplicates = dt.AsEnumerable()
.Select(dr => dr.Field<string>("PROV_NEW"))
.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.ToList();
// Now work with the set of duplicates
或者:
HashSet<string> providers = new HashSet<string>();
foreach (var provider in dt.AsEnumerable()
.Select(dr => dr.Field<string>("PROV_NEW")))
{
if (!providers.Add(provider))
{
// This provider is a duplicate
}
}
(这是有效的HashSet<T>.Add
因为如果集合中已存在该值,则返回 false。
采纳 Jon Skeet 关于在多列选择上使用匿名类型 LINQ 的建议,我为自己提供了一个解决方案,希望它也能对您有所帮助:
DataTable dt_ = _data.Tables["MyTable"];
foreach (DataRow _dr in dt_.AsEnumerable()
.GroupBy(r => new
{
c1 = r.Field<string>("ColNAME1 of table dt_"),
c2 = r.Field<string>("ColNAME2 of table dt_"),
c3 = r.Field<string>("ColNAME3 of table dt_"),
...<any number of columns can be added>
}).Where(grp => grp.Count() > 1).SelectMany(itm => itm))
{
// Handle your Duplicate row entry
}
>dtEmp
是你的工作数据表
DataTable distinctTable = dtEmp.DefaultView.ToTable( /*distinct*/ true);