Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现属性=值集合的最佳方式是什么_C#_Collections - Fatal编程技术网

C# 实现属性=值集合的最佳方式是什么

C# 实现属性=值集合的最佳方式是什么,c#,collections,C#,Collections,我围绕第三方库编写了一个包装类,它要求通过调用Config方法并传递一个格式为“Property=Value的字符串来设置属性 我希望在一个调用中传递所有属性,并迭代处理它们 我考虑了以下几点: 创建属性/值类,然后创建这些属性/值的列表 物体 构建一个多个“属性=值”的字符串,将它们分隔开来 带标记(可能是“|”)的 使用哈希表 所有这些都会起作用(我正在考虑使用选项1),但是有更好的方法吗 关于我的查询的更多细节: 完成的类将包含在库中,以便在其他应用程序中重用。虽然我目前不认为线程是一

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

我希望在一个调用中传递所有属性,并迭代处理它们

我考虑了以下几点:

  • 创建属性/值类,然后创建这些属性/值的列表 物体
  • 构建一个多个“属性=值”的字符串,将它们分隔开来 带标记(可能是“|”)的
  • 使用哈希表
所有这些都会起作用(我正在考虑使用选项1),但是有更好的方法吗

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

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

垃圾收集不会成为问题

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


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

您可以使用
字典
,然后这些项的类型为
KeyValuePair
(这与您的第一个想法相对应)
然后可以使用
myDict.Select(kvp=>string.Format(“{0}={1}”,kvp.Key,kvp.Value))
要获取具有所需格式的字符串列表,请使用示例a-它是线程安全的,而且速度非常快,因为大多数操作都是无锁实现的…

您可以创建一个帮助器类,该类使用反射将任何类转换为属性=值集合

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 + "=";  
               }
          }
     } 
}
公共静态类PropertyValueHelper
{
公共静态IEnumerable GetPropertyValue(对象源)
{ 
类型t=source.GetType();
foreach(t.GetProperties()中的var属性)
{
对象值=property.GetValue(源,空);
if(值!=null)
{
yield返回属性.Name+“=”+value.ToString();
}
其他的
{
收益率返回属性。名称+“=”;
}
}
} 
}

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

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

  • 您的代码是否需要支持多个线程同时访问数据源?如果是这样的话,正如Yahia所建议的那样,使用
    ConcurrentDictionary
    ,是有意义的。否则,就没有理由因为使用并发数据结构而产生额外的开销和复杂性
  • 您的工作环境中是否存在垃圾收集问题(例如,XNA游戏)?如果是这样的话,任何涉及字符串串联的建议都会有问题
  • 您是否需要O(1)访问数据源的任意索引?如果是这样,你的第三种方法是有意义的。另一方面,如果您所做的只是对集合进行迭代,那么就没有理由产生插入哈希表的额外开销;改用
    列表
  • 另一方面,您可能不在需要进行上述优化的环境中工作;以编程方式清晰定义键/值对的能力可能对您更重要。在这种情况下,使用
    字典
    是更好的选择
如果不完全定义功能需要做什么,您就无法对如何实现功能做出明智的决定,而且由于您还没有这样做,因此这里给出的任何答案都必然是不完整的

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

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

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

  • 如果线程安全以后变得很重要,则由调用方负责

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

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

考虑以下示例:

var configData = new Dictionary<String, String>
configData["key1"] = "value1";
configData["key2"] = "value2";
myLibraryObject.Config(configData);
var configData=新字典
configData[“key1”]=“value1”;
configData[“键2”]=“值2”;
myLibraryObject.Config(configData);
以及配置的实现:

public void Config(Dictionary<String, String> values)
{
    foreach(var kvp in values)
    {
        var configString = String.Format("{0}={1}", kvp.Key, kvp.Value);
        // do whatever
    }
}
public void配置(字典值)
{
foreach(值中的var kvp)
{
var configString=String.Format(“{0}={1}”,kvp.Key,kvp.Value);
//做任何事
}
}

你考虑过字典吗?我以前没有见过KeyValuePair结构,但现在我已经。。。我喜欢o) 都很好。这个问题更像是一个一般性的问题,因为我没有意识到它会抛出这么多其他问题。我将添加更多细节。当我被迫将值作为字符串传递时,使用StringDictionary而不是Dictionary是否有意义;StringDictionary在功能上与Dictionary不同。引用MSDN的话,在StringDictionary中,“键是以不区分大小写的方式处理的;在与字符串字典一起使用之前,它被转换为小写。”在标准字典中,“key”和“key”是不同的值。同样,这取决于您的需求。第三方公司的属性