了解泛型字典的使用

时间:2013-06-08 20:10:31

标签: c# .net generics dictionary

每当我看到这样的代码时,我的头疼。谁能解释一下这是做什么的?

public static class MyExtensionFirADictionary
{
    public static TValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
    { 
        TValue value;
        if (dic != null && dic.TryGetValue(key, out value))
            return value;

        return default(TValue);
    }
}

3 个答案:

答案 0 :(得分:2)

忽略编译错误,只是说&#34;返回对密钥持有的值,如果有的话 - 否则返回字典的默认值&#34;,通过扩展方法。该名称未显示,但可以通过以下方式使用:

string name = nameLookup.GetValueOrDefault(userId);

请注意,编译器会隐式处理泛型 - 调用者不需要指定它们。

首先,代码检查字典是否为空;如果它为null,则只返回默认值。

TryGetValue是一个标准的字典方法,它执行查找并返回true,如果它工作;代码使用该方法,并返回获取的值(如果有的话) - 否则它显式使用TValue的默认值。

答案 1 :(得分:2)

Laymans条款

//首先在示例扩展方法中添加方法名称,以便编译

public static class MyExtensionFirADictionary
{
   public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
   { 
       TValue value;
       if (dic != null && dic.TryGetValue(key, out value))
           return value;

       return default(TValue);
   }
}

现在让我们从头开始:

方法签名:

       public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)

返回TValue类型的对象,即

Dictionary<string, int> dict = new Dictionary<string, int>();

在这种情况下,如果你打电话

dict.GetGenericValue("thekey");

TValue的类型为int(注意<string, int>并将其与原始方法相关联

要理解的重要想法:

将泛型视为模板。 TValue,TKey只是您在执行此操作时指定的占位符:

List<myclass>

HTH

答案 2 :(得分:0)

它允许与默认字典行为相同的功能,但使其更易于使用。

var dictionary = new Dictionary<string, object>();

//add items to dictionary

所以默认是这样的:

    if(dictionary.ContainsKey("someKey"))
    {
        var value = dictionary["someKey"];
    }

但是,如果它没有该密钥,并且您没有执行ContainsKey检查,则会抛出异常。扩展方法的作用是,它执行TryGetValue,它检查密钥是否存在,如果是,则返回值else,返回default(T)

新的用法是(假设扩展方法的名称是GetValue):

var value = dictionary.GetValue("someKey");

更短更清洁。