gpt4 book ai didi

c# - 重构以将 NameValueCollection 和 KeyValueConfigurationCollection 作为参数?

转载 作者:行者123 更新时间:2023-11-30 15:10:11 27 4
gpt4 key购买 nike

示例代码:

EDITED :澄清示例。抱歉造成任何困惑。

        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 将获取对象并将键和值返回给您。因此,您基本上需要编写两种不同的方法来为两种类型的集合解析项目。

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

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:不确定不需要委托(delegate)是什么意思 - 如果您需要一个版本的 DoSomethingWithCollection,您至少需要一些在两个集合中工作不同的代码。委托(delegate)将是最简单的方法。另一种方法是定义一个接口(interface),该接口(interface)将提供 NamedValuePair/KeyValuePair 的集合/枚举,然后写入为不同类型的目标集合实现该接口(interface)的包装类。模板代码将是

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,对于一个简单的需求来说,工作量太大了。

关于c# - 重构以将 NameValueCollection 和 KeyValueConfigurationCollection 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com