用于从配置文件创建数组的可扩展 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 文件