将不同类型的Dictionary的重载组合成一个函数

时间:2014-08-19 14:07:09

标签: c# dictionary

我需要一个辅助函数将"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>但它没有用。

2 个答案:

答案 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));
        }
    }
}