查找重复条目 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;
        }
    }

}

查找重复条目 C#

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);