将不同类型字典的重载合并到一个函数中

本文关键字:一个 函数 同类型 字典 合并 重载 | 更新日期: 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]);
            }
        }
    }

还有其他数据类型,如longDateTime等。

有没有办法只有一个辅助功能?我试了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));
        }
    }
}