Проверка на наличие дубликатов ключей с использованием WPF и C # - PullRequest
0 голосов
/ 28 июня 2018

Я создаю приложение, которое будет искать AppSettings, перетягивать эти ключи и их значения в DataTable, использовать DataTable для редактирования или добавления ключей, проверять дубликаты ключей после их редактирования и сохранять их обратно в AppSettings , У меня сейчас три кнопки.

Один - это ProgrammedBy, который вызывает отдельную таблицу данных, просмотр параметров приложения в App.config и отображает их в таблице данных, и, наконец, кнопку «Обновить настройки», которая проверяет наличие дубликатов ключей после ввода информации в Затем в DataTable сохраните ключи и их значения обратно в AppSettings:

AppView

Вот список ключей и значений в файле App.config. Заметьте, я дал ключу дублированное имя:

App.Config

Я использую вложенный цикл для той части, где он проверяет дубликаты ключей. Библиотека System.Collection проверяет только последний дубликат ключа. Это полностью игнорирует первый. Когда я разверну или наведу указатель мыши на переменную items, Rows / Results View, в Visual Studio он показывает только 5 пар ключей. Очевидно, есть шестая пара, как видно выше. Вот для цикла for и с целью отладки я поставил точку останова после конца цикла for:

Nested For Loop within button instance

Мне нужно, чтобы он мог выдавать ошибку исключения, когда он находит дубликат ключа. Если это вообще возможно, выведите сообщение об ошибке исключения и выделите дубликат ключа. Также, если возможно, сделайте так, чтобы библиотека System.Collection не пропускала дубликат ключа или игнорировала дубликат ключа.

1 Ответ

0 голосов
/ 29 июня 2018

Вы можете использовать следующий код для поиска дубликатов ключей:

// Cast the DataTable rows to a list, and select the 'Key' column's Value
var keys = items.Rows.Cast<DataRow>().ToList().Select(r => r["Key"]);

// Find the Duplicate keys
var duplicateKeys = keys.GroupBy(x => x)
            .Where(group => group.Count() > 1)
            .Select(group => group.Key);

// Throw the exception, containing the keys that are duplicated.
if (duplicateKeys.Count() > 0) {
    throw new ConfigurationErrorsException($"Duplicate key(s) found: '{string.Join(", ", duplicateKeys)}' - please revise");
}

Способ поиска ключей в DataTable может отличаться, но все сводится к той же ситуации.

EDIT: Этот подход заменит все три цикла for в вашем примере.

Для версий Visual Studion ниже 2015:

    throw new ConfigurationErrorsException("Duplicate key(s) found: " + string.Join(", ", duplicateKeys) + " - please revise.");
...