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

时间:2011-09-01 14:07:35

标签: c# collections

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

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

我考虑过以下几点:

  • 创建属性/值类,然后创建这些列表 对象
  • 构建一个多个“ Property = Value ”的字符串,将它们分开 带有令牌(可能是“|”)
  • 使用哈希表

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

关于我的查询的更详细信息:

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

垃圾收集不会成为问题。

目前不存在访问数据源的任意索引的问题。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  • 您的代码是否需要支持同时访问数据源的多个线程?如果是这样的话,正如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
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以创建一个使用反射的辅助类将任何类转换为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 + "=";  
               }
          }
     } 
}

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