首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当具有非空值的字典没有匹配时,返回null

当具有非空值的字典没有匹配时,返回null
EN

Stack Overflow用户
提问于 2020-04-19 10:11:02
回答 4查看 876关注 0票数 1

我有一个整型值的字典。当我使用类型为Nullable<int>的属性之一填充类时,我希望根据给定的产品id使用字典中的值填充该属性。

当给定的产品id没有对应的值时,我如何获得可空类型?

代码语言:javascript
复制
public class OrderLine
{
    public int? AvailableQuantity { get; set; }
}

var selectedProductId = Guid.NewGuid();
var products = new Dictionary<Guid, int>
{
    { Guid.NewGuid(), 1 },
    { Guid.NewGuid(), 2 },
    { Guid.NewGuid(), 3 },
};

var result = new OrderLine
{
    Id = Guid.NewGuid(),
    ProductId = selectedProductId,
    AvailableQuantity = products.GetValueOrDefault(selectedProductId, default)
};

上面的方法返回0而不是null

当我尝试编译时,编译器无法编译

代码语言:javascript
复制
AvailableQuantity = products.GetValueOrDefault(selectedProductId, default(int?))

不能从用法中推断方法'TValue System.Collections.Generic.CollectionExtensions.GetValueOrDefault(this IReadOnlyDictionary,TKey,TValue‘的类型参数。尝试显式指定类型参数。

我无法改变字典的类型。字典是一种广泛使用的返回类型方法。当我们需要处理产品id不能在字典中的场景时,这是第一种情况。

我想避免枚举字典,将它的类型更改为可空

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-19 10:22:21

您可以编写使用C#的TryGetValue扩展。

例如:

代码语言:javascript
复制
public static class DictionaryExtensions
{
    public static TValue? GetValueOrNull<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key)
        where TValue : struct
    {
        if (dict.TryGetValue(key, out TValue value))
        {
            return value;
        }

        return null;
    }
}

用法:

代码语言:javascript
复制
products.GetValueOrNull(selectedProductId);

PS:此扩展还适用于int以外的其他类型,例如decimalbool和其他结构类型。

票数 5
EN

Stack Overflow用户

发布于 2020-04-19 10:28:12

如果只执行一次,请使用三元运算符。

代码语言:javascript
复制
Quantity = products.TryGetValue(productId, out var qty) ? qty : default(int?)

如果要在多个地方执行此操作,则将上面的代码包装成扩展方法。

票数 1
EN

Stack Overflow用户

发布于 2020-04-19 10:17:48

得到默认值0,因为它是int的默认值(不可为空)。

要获得null的默认值,请将字典中值的类型更改为int? (可空):

代码语言:javascript
复制
var products = new Dictionary<Guid, int?>
{
    { Guid.NewGuid(), 1 },
    { Guid.NewGuid(), 2 },
    { Guid.NewGuid(), 3 },
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61302648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档