Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于Python的C#字典';s get()方法_C#_Python_Dictionary - Fatal编程技术网

相当于Python的C#字典';s get()方法

相当于Python的C#字典';s get()方法,c#,python,dictionary,C#,Python,Dictionary,在Python中,如果我有一个dict,并且我想从一个dict中获取一个值,其中键可能不存在,我会执行以下操作: lookupValue = somedict.get(someKey, someDefaultValue) 其中,如果someKey不存在,则返回someDefaultValue 在C#中,有一个类似的TryGetValue(): var lookupValue; if(!somedict.TryGetValue(someKey, lookupValue)) lookupV

在Python中,如果我有一个dict,并且我想从一个dict中获取一个值,其中键可能不存在,我会执行以下操作:

lookupValue = somedict.get(someKey, someDefaultValue)
其中,如果
someKey
不存在,则返回
someDefaultValue

在C#中,有一个类似的
TryGetValue()

var lookupValue;
if(!somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;
不过,其中一个问题是,如果
someKey
null
,则会引发异常,因此需要进行null检查:

var lookupValue = someDefaultValue;
if (someKey != null && !somedict.TryGetValue(someKey, lookupValue))
    lookupValue = someDefaultValue;

有没有一种更简洁(即1行)的方法,很像Python的
get()

TryGetValue不是您要寻找的方法。此方法返回一个布尔值。如果找到键,则为True;如果未找到,则为false。如果找到键,则将为您选择的变量设置值。您想要的方法在dictorial类中不存在。 因此,您有两种解决问题的方法:

  • 检查它是否存在:

    var value;
    if (somedic.TryGetValue("key", out value))
       lookupValue  = value;
    else
       lookupValue = defaultValue;
    
  • 创建自己的方法,如下图所示


  • 下面是使用
    TryGetValue
    的正确方法。请注意,在调用
    TryGetValue
    之前,您不能将返回值设置为默认值,只需将其返回,因为
    TryGetValue
    将在找不到键时将其重置为默认值

    public static TValue GetOrDefault<TKey, TValue>(
        this IDictionary<TKey, TValue> dictionary, 
        TKey key, 
        TValue defaultValue)
    {
        TValue value;
        if(key == null || !dictionary.TryGetValue(key, out value))
            return defaultValue;
        return value;
    }
    

    恐怕没有这样的办法。但您始终可以定义自己的扩展来包装这三行。或者你可以使用三元来表示一行,但这与你的方法没有太大区别。我认为三元仍然不是一行,因为你必须在
    TryGetValue
    之前声明
    lookupValue
    ,对吗?@AdamParkin是的,您必须首先声明传递给
    TryGetValue
    的out值,这是绝对正确的。您可以通过
    var value=key!=空和dic.ContainsKey(键)?dic[键]:默认值
    这比
    TryGetValue
    效率低,因为当键在字典中时,它会执行两次查找。当然,但dict键是散列的,所以它仍然是常量时间(即O(1)+O(1)==O(1)),对吗?@AdamParkin True,复杂性不会改变,但是做两次总是比做一次要花费更长的时间。你还必须检查密钥是否为null,除非你将密钥类型设置为不可为null的结构(除非你想在密钥为null时引发异常)。是的,没错。所以最好按照博客中所示实现它。博客也不会测试密钥是否为null。该方法将为null键引发异常,但这可能是正确的操作过程,也可能不是正确的操作过程,但如果该键为null,则OP似乎需要默认值。
    return key ==  null || !dictionary.TryGetValue(key, out var value)
        ? defaultValue
        : value;