【问题标题】:Combine overloading for different types of Dictionary into one function将不同类型字典的重载合并为一个函数
【发布时间】:2014-10-12 16:19:14
【问题描述】:

我需要一个辅助函数来将"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&lt;object, object&gt;,但没用。

【问题讨论】:

    标签: c# dictionary


    【解决方案1】:

    是的,您应该使用通用方法。就我个人而言,我会让它返回一个新字典而不是清除现有字典,请注意......并使用 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);
    

    【讨论】:

      【解决方案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));
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        相关资源
        最近更新 更多