我需要一个辅助函数将"1=alice;2=bob;3=charlie"
之类的字符串转换为Dictionary<int, string>
,将"1=true;2=false;3=true"
之类的字符串转换为Dictionary<int, bool>
等等。
为此,我编写了许多辅助函数,它们基本上是相互复制和粘贴的:
private static void load(Dictionary<int, string> dict, string s)
{
dict.Clear();
string[] items = s.Split(';');
foreach (string item in items)
{
if (item.Contains("="))
{
string[] kv = item.Split('=');
dict[int.Parse(kv[0])] = kv[1];
}
}
}
private static void load(Dictionary<int, bool> dict, string s)
{
dict.Clear();
string[] items = s.Split(';');
foreach (string item in items)
{
if (item.Contains("="))
{
string[] kv = item.Split('=');
dict[int.Parse(kv[0])] = bool.Parse(kv[1]);
}
}
}
private static void load(Dictionary<int, int> dict, string s)
{
dict.Clear();
string[] items = s.Split(';');
foreach (string item in items)
{
if (item.Contains("="))
{
string[] kv = item.Split('=');
dict[int.Parse(kv[0])] = int.Parse(kv[1]);
}
}
}
还有更多其他数据类型,例如long
,DateTime
等。
有没有办法只有一个辅助功能?我试过Dictionary<object, object>
但它没有用。
答案 0 :(得分:5)
是的,您应该使用通用方法。就个人而言,我会让它返回一个新的字典,而不是清除现有的字典,请注意......并使用LINQ来实现它:
private static Dictionary<int, T> Load<T>(string text, Func<string, T> parser)
{
return s.Split(';')
.Where(item => item.Contains("="))
.Select(item => item.Split('=', 2))
.ToDictionary(pair => int.Parse(pair[0]), pair => parser(pair[1]));
}
然后用:
调用它Dictionary<int, int> foo = Load(text, int.Parse);
Dictionary<int, bool> bar = Load(text, bool.Parse);
Dictionary<int, string> baz = Load(text, x => x);
答案 1 :(得分:2)
你可以使它成为泛型并使用Convert.ChangeType
,它将尝试解析输出类型的任何字符串输入:
private static void load<T>(Dictionary<int, T> dict, string s)
{
dict.Clear();
string[] items = s.Split(';');
foreach (string item in items)
{
if (item.Contains("="))
{
string[] kv = item.Split('=');
dict[int.Parse(kv[0])] = (T)Convert.ChangeType(kv[1], typeof(T));
}
}
}