将不同类型字典的重载合并到一个函数中
本文关键字:一个 函数 同类型 字典 合并 重载 | 更新日期: 2023-09-27 18:18:45
>我需要一个辅助函数来将像"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>
,但没有用。
是的,你应该有一个泛型方法。就个人而言,我会让它返回新字典而不是清除现有字典,请注意......并使用 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);
您可以将其设为通用并使用 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));
}
}
}