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

我有如下所示的配置值

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

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

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

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

参考

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

【问题讨论】:

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

标签: c# asp.net .net linq design-patterns


【解决方案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 个设置有影响。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 2019-04-04
  • 2023-03-23
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多