C# 检查DataTable中是否存在重复行(有扭曲)

C# 检查DataTable中是否存在重复行(有扭曲),c#,winforms,datagridview,C#,Winforms,Datagridview,关于如何检查DataTable中的重复项,有很多示例,但是在DataGridView中存在隐藏的标识列时,找不到任何关于如何实现重复项的示例。 所以我有一个DataGridView,它的数据源来自SQL查询。该查询返回三列、唯一标识符和网格所需的数据。当保存回数据时,我需要标识列,但希望能够在保存之前检查记录的重复项,这在目前不起作用,因为标识使每一行都是唯一的。还有一个“删除”列,因此记录如下所示: 下面是我用来检查重复项的代码: // Create a copy of th

关于如何检查DataTable中的重复项,有很多示例,但是在DataGridView中存在隐藏的标识列时,找不到任何关于如何实现重复项的示例。 所以我有一个DataGridView,它的数据源来自SQL查询。该查询返回三列、唯一标识符和网格所需的数据。当保存回数据时,我需要标识列,但希望能够在保存之前检查记录的重复项,这在目前不起作用,因为标识使每一行都是唯一的。还有一个“删除”列,因此记录如下所示:

下面是我用来检查重复项的代码:

        // Create a copy of the data
        var duplicateTable = dataTable.Clone();
        var primaryKey = new DataColumn[duplicateTable.Columns.Count];
        duplicateTable.Columns.CopyTo(primaryKey, 0);
        duplicateTable.PrimaryKey = primaryKey;
        // Check if any data row has a duplicate
        return dataTable.Rows.Cast<DataRow>().Any(dataRow => duplicateTable.Rows.Contains(dataRow.ItemArray));
//创建数据的副本
var duplicateTable=dataTable.Clone();
var primaryKey=newdatacolumn[duplicateTable.Columns.Count];
duplicateTable.Columns.CopyTo(primaryKey,0);
duplicateTable.PrimaryKey=PrimaryKey;
//检查是否有重复的数据行
返回dataTable.Rows.Cast().Any(dataRow=>duplicateTable.Rows.Contains(dataRow.ItemArray));
我想做的是检查两列项目和开始日期,看看是否有重复的

提前谢谢


Martin

在谷歌的帮助下,通过研究这个问题,我制定了一个方法,实现了我希望它做的事情——请参见下文。
非常感谢
马丁

私有静态bool有重复项(DataTable)
{
var blnReturnValue=false;
如果(dataTable.Rows.Count==0)转到跳过点;
var dataColumns=新列表();
对于(var i=0;i
{
var item=dataColumns.FirstOrDefault(l=>
l、 ItemValue==k.ItemValue&&l.EffectiveDate==k.EffectiveDate);
如果(项!=null)blnReturnValue=true;
});
跳跃点:
返回blnReturnValue;
}
内部类数据
{
内部int ItemId{get;set;}
内部int ItemValue{get;set;}
内部日期时间有效日期{get;set;}
}

为什么要创建表的副本,然后检查副本?当然,如果您将数据从一个表复制到另一个表,会有重复的数据(所有数据都会重复,不是吗?)。不清楚您试图实现什么。如果不清楚,请道歉-我试图做的是在保存数据之前查找datatable中是否存在任何重复行。我提出了一个部分解决方案,但无法添加主键,因为测试数据不是唯一的(因为它现在包含重复项)。
//仅为两个特定列var dataColumns=dataTable.DefaultView.ToTable(false,“ItemValue”,“EffectiveDate”)创建数据副本;var duplicateTable=dataColumns.Copy();var primaryKey=newdatacolumn[duplicateTable.Columns.Count];duplicateTable.Columns.CopyTo(primaryKey,0);duplicateTable.PrimaryKey=PrimaryKey;//检查是否有任何数据行具有重复的返回dataColumns.Rows.Cast().any(dr=>duplicateTable.Rows.Contains(dr.ItemArray))
在示例网格中,我添加了一个重复行,即38,开始日期为2017年7月3日,并希望在尝试保存之前返回数据中存在重复行。这有意义吗?而且,我意识到我正在克隆表,所以表中没有数据!我现在正在将数据和结构复制到新表中。
        private static bool HasDuplicates(DataTable dataTable)
        {
            var blnReturnValue = false;
            if (dataTable.Rows.Count == 0) goto SkipPoint;
            var dataColumns = new List<ProfessionalData>();
            for (var i = 0; i < dataTable.Rows.Count; i++)
            {
                var professionalRecord = new ProfessionalData
                {
                    ItemId = Convert.ToInt32(dataTable.Rows[i]["ItemId"]),
                    ItemValue = Convert.ToInt32(dataTable.Rows[i]["ItemValue"]),
                    EffectiveDate = Convert.ToDateTime(dataTable.Rows[i]["EffectiveDate"].ToString())
                };
                dataColumns.Add(professionalRecord);
            }

            dataColumns.ForEach(k =>
            {
                var item = dataColumns.FirstOrDefault(l =>
                    l.ItemValue == k.ItemValue && l.EffectiveDate == k.EffectiveDate);
                if (item != null) blnReturnValue = true;
            });

            SkipPoint:
            return blnReturnValue;
        }

        internal class ProfessionalData
        {
            internal int ItemId { get; set; }
            internal int ItemValue { get; set; }
            internal DateTime EffectiveDate { get; set; }
        }