首页 > 解决方案 > 使用 WPF 和 C# 检查重复键

问题描述

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

一个是ProgrammedBy拉出一个单独的数据表,在 App.config 中查看应用程序设置并将其显示在数据表上,最后是一个更新设置按钮,用于在数据表上输入信息后检查重复键,然后保存键和将它们的值返回给 AppSettings:

应用视图

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

应用程序配置

我在检查重复键的部分使用了嵌套的 for 循环。System.Collection 库仅检查最后一个重复键。它完全忽略了第一个。当我在 Visual Studio 中向下钻取或将鼠标悬停在项目变量 Rows/Results View 上时,它只显示一个 5 键对。如上所示,显然有第 6 对。这是 for 循环,为了调试,我在 for 循环的末尾放置了一个断点:

嵌套在按钮实例中的 For 循环

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

标签: c#wpfvisual-studio-2017configurationmanagersystem.configuration

解决方案


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

// 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 中查找键的方式可能会有所不同,但归结为相同的情况。

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

对于 2015 以下的 Visual Studion 版本:

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

推荐阅读