DoSomethingWithCollection

DoSomethingWithCollection

示例代码:

编辑:澄清的例子。抱歉给您带来任何混乱。

        using System.Collections.Specialized;
        using System.Configuration;

    ...

        // get collection 1

        NameValueCollection c1 = ConfigurationManager.AppSettings;

        // get collection 2

        ExeConfigurationFileMap map = new ExeConfigurationFileMap();
        map.ExeConfigFilename = "c:\\SomeConfigFile.config";
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        KeyValueConfigurationCollection c2 = config.AppSettings.Settings;

        // do something with collections

        DoSomethingWithCollection(c1);
        DoSomethingWithCollection(c2);
...

    private void DoSomethingWithCollection(KeyValueConfigurationCollection c)
    {
        foreach(KeyValueConfigurationElement el in c)
        {
            string key = el.Key;
            string val = el.Value;
            // do something with key and value
        }
    }

    private void DoSomethingWithCollection(NameValueCollection c)
    {
        for(int i=0; i < c.Count; i++)
        {
            string key = c.GetKey(i);
            string val = c.Get(i);
            // do something with key and value
        }
    }


当前有两个版本的DoSomethingWithCollection可以使用NameValueCollection或KeyValueConfigurationCollection。

有没有更干净的方法可以做到,所以只有DoSomethingWithCollection的一个版本?

谢谢。

最佳答案

好吧,DoSomethingWithCollection应该接受两个参数-1)ICollection / IEnumerable,它将允许您枚举所有值2)委托将获取对象,并返回键和值。因此,您实际上需要编写两种不同的方法来解析两种类型的集合的项目。

编辑:给出想法的示例代码。

delegate void KeyValueItemParser(object item, out string key, out string value);

void DoSomethingWithCollection(ICollection items, KeyValueItemParser parser)
{

   string key, value
   foreach(object item in items)
   {
      parser(item, out key, out value);
      // do whatever you want to with key & value
   }
}


编辑2:不确定不需要委托的意思-如果需要DoSomethingWithCollection的一个版本,则至少需要一些可以在两个集合中工作的代码。委托将是最简单的方法。另一种方法是定义一个接口,该接口将提供NamedValuePair / KeyValuePair的集合/枚举,然后写入实现该接口的包装器类以用于不同类型的目标集合。模板代码应为

interface IKeyValuePairCollection
{
  int Count {get; }
  KeyValuePair<string, string> Item(int index) { get; }
}

class NamedValueCollectionWrapper : IKeyValuePairCollection
{

   private NamedValueCollection _inner;

   public NamedValueCollectionWrapper(NamedValueCollection target)
   {
     -inner = target;
   }

   // roll out ur implementation to IKeyValuePairCollection
}

class KeyValueConfigurationCollectionWrapper : IKeyValuePairCollection
{
  ...
}


IMO,为一个简单的要求而做的太多工作。

10-08 13:41