Проверка DataTable для дубликатов строк (с изюминкой) - PullRequest
0 голосов
/ 25 марта 2020

Существует множество примеров того, как проверить наличие дубликатов в DataTable, но не могу найти ничего о том, как этого добиться, когда в DataGridView есть скрытый столбец идентификаторов. Итак, у меня есть DataGridView, источник данных которого поступает из SQL запроса. Этот запрос возвращает три столбца, уникальный идентификатор и данные, необходимые для сетки. При сохранении данных мне нужен столбец идентификаторов, но я хочу иметь возможность проверять записи на наличие дубликатов перед сохранением, что в настоящее время не работает, поскольку идентификация делает каждую строку уникальной. Существует также столбец «Удалить», поэтому запись выглядит следующим образом: Example Grid

Вот код, который я использую для проверки дубликатов:

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

Что я хочу сделать, так это проверить два столбца «Элемент» и «Дата начала», чтобы выяснить, являются ли какие-либо из них дубликатами.

Заранее спасибо

Мартин

1 Ответ

0 голосов
/ 26 марта 2020

Прорабатывая проблему и с помощью Google, я собрал подход, который делает то, что я хотел, - см. Ниже.
Большое спасибо
Мартин

        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; }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...