c# - 使用 WPF 和 C# 检查重复键
问题描述
我正在创建一个应用程序,它将查看 AppSettings,将这些键及其值拉到 DataTable 中,使用 DataTable 编辑或添加键,在编辑后检查重复键,并将它们保存回AppSettings
. 我目前有三个按钮。
一个是ProgrammedBy
拉出一个单独的数据表,在 App.config 中查看应用程序设置并将其显示在数据表上,最后是一个更新设置按钮,用于在数据表上输入信息后检查重复键,然后保存键和将它们的值返回给 AppSettings:
这是 App.config 文件中的键和值的列表。注意我给了一个键一个重复的名字:
我在检查重复键的部分使用了嵌套的 for 循环。System.Collection 库仅检查最后一个重复键。它完全忽略了第一个。当我在 Visual Studio 中向下钻取或将鼠标悬停在项目变量 Rows/Results View 上时,它只显示一个 5 键对。如上所示,显然有第 6 对。这是 for 循环,为了调试,我在 for 循环的末尾放置了一个断点:
我需要它能够在找到重复键时抛出异常错误。如果可能的话,抛出异常错误消息并突出显示该重复键是什么。此外,如果可能,使 System.Collection 库不跳过重复键或忽略重复键。
解决方案
您可以使用以下代码查找重复键:
// 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.");
推荐阅读
- node.js - 如何将nodejs服务器发送的pdf数据转换为angularjs中的pdf
- php - htaccess mod rewrite 防止变量在包含的文件中假定它们的值
- java - 当我使用不同的变量时,为什么 java 复制而不是创建一个新的 Instant?
- neo4j - 从 CSV 到 Neo4J 的 Cypher 导入 - 如何提高性能
- .net - 数据库连接(无法打开登录请求的数据库“VRM”。)
- laravel - 如何检查新的年龄范围是否重叠?
- angular - Ionic 3 侧边菜单在按钮单击时关闭
- excel - 删除 Excel 中的所有注释
- c++ - 为什么 std::vector::operator= 过度分配内存?
- android - 我如何解析这个请求的响应?