使用WPF和C#

时间:2018-06-28 20:25:43

标签: c# wpf visual-studio-2017 configurationmanager system.configuration

我正在创建一个应用程序,它将查找AppSettings,将这些键及其值上拉到DataTable中,使用DataTable编辑或添加键,在编辑后检查重复的键,然后将它们保存回{{1 }}。我目前有三个按钮。

一个是AppSettings,它会拉出一个单独的数据表,在App.config中显示一个View App Settings并将其显示在数据表上,最后是一个Update Settings按钮,该按钮在输入信息后检查重复的键然后在DataTable上将键及其值保存回AppSettings:

AppView

这是App.config文件中的键和值的列表。请注意,我给钥匙起了一个重复的名字:

App.Config

我正在使用嵌套的for循环来检查重复的键。 System.Collection库仅检查最后一个重复的密钥。它完全忽略了第一个。当我在Visual Studio中向下钻取或将鼠标悬停在items变量“行/结果视图”上时,它只显示5个键对。如上所示,显然有第六对。这是for循环,出于调试目的,我在for循环的末尾放置了一个断点:

Nested For Loop within button instance

我需要它能够在找到重复键时引发异常错误。如果有可能,抛出异常错误消息并突出显示该重复键是什么。另外,请尽可能使System.Collection库不要跳过重复键或忽略重复键。

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码查找重复的键:

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

从数据表中查找键的方法可能有所不同,但是归结为相同的情况。

编辑: 这种方法将替换示例中的所有三个for循环。

对于低于2015年的Visual Studion版本:

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