繁体   English   中英

实现property = value集合的最佳方法是什么

[英]What is the best way to implement a property=value collection

我已经围绕第三方库编写了一个包装类,它需要通过调用Config方法并传递格式为“ Property = Value ”的字符串来设置属性。

我想在一次调用中传递所有属性并迭代地处理它们。

我考虑过以下几点:

  • 创建属性/值类,然后创建这些对象的List
  • 构建一个多个“ Property = Value ”的字符串,用一个标记分隔它们(可能是“|”)
  • 使用哈希表

所有这些都可行(我正在考虑使用选项1)但是有更好的方法吗?

关于我的查询的更多细节:

完成的类将包含在库中,以便在其他应用程序中重用。 虽然我目前没有将线程视为一个问题(我们的应用程序往往只有一个UI线程和一个工作线程),但它可能会成为未来的问题。

垃圾收集不会成为问题。

目前,访问数据源的任意索引不是问题。

优化目前不是问题,但明确定义键/值对很重要。

您可以使用Dictionary<string,string> ,这些项目的类型为KeyValuePair<string,string> (这与您的第一个想法相对应)您可以使用myDict.Select(kvp=>string.Format("{0}={1}",kvp.Key,kvp.Value))获取具有所需格式的字符串列表

正如您已经指出的那样,任何提议的解决方案都将完成您所描述的任务。 这意味着选择特定方法的唯一合理方法是定义您的要求:

  • 您的代码是否需要支持同时访问数据源的多个线程? 如果是这样的话,正如Yahia所建议的,使用ConcurrentDictionary是有道理的。 否则,没有理由引起使用并发数据结构的额外开销和复杂性。
  • 您是否在垃圾收集存在问题的环境中工作(例如,XNA游戏)? 如果是这样,任何涉及字符串串联的建议都将成为问题。
  • 您是否需要O(1)访问数据源的任意索引? 如果是这样,你的第三种方法是有道理的 另一方面,如果您所做的只是迭代集合,则没有理由承担插入哈希表的额外开销; 请改用List<KeyValuePair<String, String>>
  • 另一方面,您可能无法在需要上述优化的环境中工作; 以编程方式清楚地定义键/值对的能力对您来说可能更重要。 在这种情况下使用Dictionary是一个更好的选择。

如果没有完全定义功能需要 执行的功能,您无法做出如何实现功能的明智决定,并且由于您没有这样做,因此此处给出的任何答案都必然是不完整的。

鉴于您的澄清,我个人会建议如下:

  • 根据MSDN指南,默认情况下避免使Config()方法成为线程安全的:

    默认情况下,类库不应该是线程安全的。 添加锁以创建线程安全的代码会降低性能,增加锁争用,并且可能会发生死锁错误。

  • 如果线程安全性在以后变得重要,请将其作为调用者的责任。

  • 鉴于您没有特殊的性能要求,请坚持使用字典以便轻松定义和读取键/值对。

  • 为简单起见,为避免生成大量不必要的字符串进行连接,只需直接传递字典并迭代它。

请考虑以下示例:

var configData = new Dictionary<String, String>
configData["key1"] = "value1";
configData["key2"] = "value2";
myLibraryObject.Config(configData);

并且Config的实现:

public void Config(Dictionary<String, String> values)
{
    foreach(var kvp in values)
    {
        var configString = String.Format("{0}={1}", kvp.Key, kvp.Value);
        // do whatever
    }
}

例如,使用ConcurrentDictionary<string,string> - 它是线程安全且非常快,因为大多数操作都是无锁实现的......

您可以创建一个使用反射的帮助程序类,将任何类转换为Property = Value集合

public static class PropertyValueHelper
{
     public static IEnumerable<string> GetPropertyValues(object source)
     { 
          Type t = source.GetType();

          foreach (var property in t.GetProperties())
          {
               object value = property.GetValue(source, null);
               if (value != null)
               {
                    yield return property.Name + "=" + value.ToString();
               }
               else
               {
                    yield return property.Name + "=";  
               }
          }
     } 
}

您需要添加额外的逻辑来处理枚举,索引属性等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM