none
怎么样写一个通用的方法取出dictionary<>的值 RRS feed

  • 问题

  • Dictionary<> 的TryGetValue 本来是可以取值的,不过返回的是bool,比较麻烦,   像 int之类的,我可以自己写一个函数,把取的结果直接返回,这样读取配置文件的时在很多行的情况下比较容易看一点,可是Dictionary<> 是泛型的,好像不能这么写......,有没有什么方法可以实现呢,,
    我int类型的函数大概是这样的

    public int IntGetValue(string s)
    {
        int temp;
        if(int.tryparse(s,out temp))
        {
            return temp;
        }

        return 0;
    }



    有没有什么方法可以使Dictionary<> 类型也实现这样的呢...最好不要用反射
    2009年9月14日 15:26

答案

  • 可以用c#3.0的扩展方法
    • 已标记为答案 启天 2009年9月14日 16:20
    2009年9月14日 15:33
  • 您好,可以使用组合或继承两种方式来实现。我举个继承的例子。
        public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
        {
            public TValue MyTryGetValue(TKey tKey)
            {
                TValue tValue = default(TValue);
                this.TryGetValue(tKey, out tValue);
                return tValue;
            }
        }

        static void Main(string[] args)
        {
                MyDictionary<string, int> myDictionary = new MyDictionary<string, int>();
                myDictionary.Add("key", 1);
                int myValue = myDictionary.MyTryGetValue("key");
        }

       继承的写法简单一些,如果想用组合的方式,可以参照的写一下,繁琐一些。
    • 已标记为答案 启天 2009年9月14日 16:19
    2009年9月14日 16:11

全部回复

  • 可以用c#3.0的扩展方法
    • 已标记为答案 启天 2009年9月14日 16:20
    2009年9月14日 15:33
  • 您好,可以使用组合或继承两种方式来实现。我举个继承的例子。
        public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
        {
            public TValue MyTryGetValue(TKey tKey)
            {
                TValue tValue = default(TValue);
                this.TryGetValue(tKey, out tValue);
                return tValue;
            }
        }

        static void Main(string[] args)
        {
                MyDictionary<string, int> myDictionary = new MyDictionary<string, int>();
                myDictionary.Add("key", 1);
                int myValue = myDictionary.MyTryGetValue("key");
        }

       继承的写法简单一些,如果想用组合的方式,可以参照的写一下,繁琐一些。
    • 已标记为答案 启天 2009年9月14日 16:19
    2009年9月14日 16:11
  • 恩,我估计也就只能用这种方法了,不过3.0的的扩展方法在2.0的framework上能正常使用的么

    2009年9月14日 16:19
  • 恩,这也不失一个解决办法,实在没办法就只能用这种

    2009年9月14日 16:19
  • 不够我试了一下,有个问题想问一下,我的代码是这样的

    扩展方法是这样的:

        public static class ExpCls
        {
            public static TValue MyGetValue<TKey, TValue>(this Dictionary<TKey, TValue> i,TKey key,TValue defalutvalue)
            {
                TValue tv;

                if(i.TryGetValue(key,out tv))
                {
                    return tv;
                }

                return defalutvalue;
            }
        }


    调用的时候是这样的:
                var io = new Dictionary<StringBuilder, string>();

                io.MyGetValue("ppp",null);

    在 StringBuilder 这里,我要是string的话,就一定问题都没有,但是当用stringbuilder或者其他就会提示:
    错误 3 无法从用法中推导出方法“WindowsFormsApplication2.ExpCls.MyGetValue<TKey,TValue>(System.Collections.Generic.Dictionary<TKey,TValue>, TKey, TValue)”的类型实参。请尝试显式指定类型实参。


    2009年9月14日 16:45
  • 呃...这个问题没事了,是我昨晚自己打错了,感谢各位了
    2009年9月15日 7:08