用于从配置文件创建数组的可扩展 C# 代码

Posted

技术标签:

【中文标题】用于从配置文件创建数组的可扩展 C# 代码【英文标题】:Scalable C# Code for Creating Array from Config File 【发布时间】:2012-07-31 13:57:41 【问题描述】:

我有如下所示的配置值

add key="Screen1" value ="Admin"
add key="Screen2" value ="Log"

将来会添加新的屏幕。在 C# 中,我需要使用这些屏幕名称创建一个字符串数组。我们如何做到这一点(请记住,即使我们添加新屏幕,代码也需要工作)?

注意 1:我正在寻找一种使用自定义配置的方法。

注意 2:我将拥有最多 10 个名称以“屏幕”开头的配置项。但我会有 10,000 个其他配置项。

参考

    Better code/ Pattern for checking existence of value Generic method for reading config sections Generating numbers list in C# Detecting sequence of at least 3 sequential numbers from a given list Does LINQ cache computed values? Is there an easy method to combine two relative paths in C#?

【问题讨论】:

我可能遗漏了一些东西,但我没有看到问题和自定义身份验证之间的联系 好了,现在一切都变得更有意义了。奥德的回答非常正确。 “我正在寻找一种不使用自定义配置的方法。” - 不存在其他解决方案。 不明白为什么您不想要自定义配置。您是在问如何读取这些值吗?而不是一个数组将它们读入 DictionaryList。 @Ramhound:公牛便便。当然还有另一种方式。只需枚举所有设置键并使用以“屏幕”开头的键。 【参考方案1】:
ConfigurationManager.AppSettings.AllKeys
    .Where( key => key.StartsWith( "Screen" ) )
    .Select( key => ConfigurationManager.AppSettings[key] )

如果您有很多设置(例如,10K,就像您在 cmets 中指定的那样),您可能会受益于 AppSettings 集合针对按键查找进行了优化这一事实。为此,您必须反复尝试“Screen1”、“Screen2”、“Screen3”等,并在没有找到值时停止:

Enumerable.Range( 1, int.MaxValue )
    .Select( i => ConfigurationManager.AppSettings[ "Screen" + i ] )
    .TakeWhile( value => value != null )

然而,这种方法正是 Knuth 先生警告我们的那种“过早优化”。配置文件根本不应该包含那么多设置,句号。

另一个缺点:请记住,这种方法假定“屏幕*”设置的编号没有间隙。也就是说,如果你有“Screen1”、“Screen2”和“Screen4”,它不会拾取最后一个。如果您打算进行大量此类设置,那么每次添加或删除设置时都“移动”所有数字会变得非常不方便。

【讨论】:

谢谢。这绝对是我所问的答案。但是,现在,我担心性能问题。 @Lijo:看不到任何性能问题,除非您有数千个配置设置。但是,就像我之前说的:最好的方法肯定是使用专用的数据结构进行访问控制。 @Lijo:不过,回答你的问题。是的,有一种方法可以不扫描整个东西......有点。当您按名称访问设置值时,即ConfigurationManager.AppSettings["MySetting"],它不会扫描整个内容,而是使用针对按键查找优化的数据结构(特别是哈希表)。您可以通过反复尝试“Screen1”、“Screen2”、“Screen3”等来使用它。其中每一个的复杂度都为 O(1),这将为您提供 O(K) 的总数,其中 K 是“屏幕*”设置的实际数量,而不是设置的总数。查看我的编辑。 @Lijo:请记住,我更新的答案假定“屏幕*”设置的编号没有间隙。也就是说,如果你有“Screen1”、“Screen2”和“Screen4”,它不会拾取最后一个。如果您打算进行大量此类设置,则每次添加或删除设置时都“移动”所有数字会变得非常不方便。 @Lijo:好的,伙计,我确实更新了答案,但你知道吗,此时我开始觉得自己被直接利用了。您没有表现出任何努力,但希望社区免费解决您的问题。这至少是不公平的。我不再回答任何请求或 cmets。【参考方案2】:

按照this question 的回答中的描述创建您自己的配置部分。

通过这样做,您可以完全控制配置文件中的内容以及它如何暴露给应用程序。

另请参阅 MSDN 上的 How to: Create Custom Configuration Sections Using ConfigurationSection 以获取分步教程。

【讨论】:

谢谢。我认为,这将是最好的解决方案。但我正在寻找一种不使用自定义配置的方法。 @Lijo - MSDN 文章的链接没有任何身份验证要求。【参考方案3】:

我不完全确定是否理解该问题,但您可以列举设置并选择所有以“屏幕”开头的设置。

看看Enumerating Settings in .NET Applications。

【讨论】:

我认为,这会导致性能问题。我将拥有最多 10 个名称以“屏幕”开头的配置项。但我会有 10,000 个其他配置项。 @Lijo - 不要想 - 试试看 :) 对设置的访问是正常缓存的,但我不知道这对 10000 个设置有影响。

以上是关于用于从配置文件创建数组的可扩展 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章

C# 字节数组到 Javascript Blob 以创建和自动下载 PDF 文件

C# MVC - 上传多个大文件创建字节数组

创建具有重复选项的可配置产品

配置文件对象 + 视图模型 + 更新用户配置文件 MVC C#

如何将文件扩展名关联到 C# 中的当前可执行文件

如何在 c# 中基于构造函数方法创建数组?