我有一个整型值的字典。当我使用类型为Nullable<int>的属性之一填充类时,我希望根据给定的产品id使用字典中的值填充该属性。
当给定的产品id没有对应的值时,我如何获得可空类型?
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
当我尝试编译时,编译器无法编译
AvailableQuantity = products.GetValueOrDefault(selectedProductId, default(int?))不能从用法中推断方法'TValue System.Collections.Generic.CollectionExtensions.GetValueOrDefault(this IReadOnlyDictionary,TKey,TValue‘的类型参数。尝试显式指定类型参数。
我无法改变字典的类型。字典是一种广泛使用的返回类型方法。当我们需要处理产品id不能在字典中的场景时,这是第一种情况。
我想避免枚举字典,将它的类型更改为可空
发布于 2020-04-19 10:22:21
您可以编写使用C#的TryGetValue扩展。
例如:
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;
}
}用法:
products.GetValueOrNull(selectedProductId);PS:此扩展还适用于int以外的其他类型,例如decimal、bool和其他结构类型。
发布于 2020-04-19 10:28:12
如果只执行一次,请使用三元运算符。
Quantity = products.TryGetValue(productId, out var qty) ? qty : default(int?)如果要在多个地方执行此操作,则将上面的代码包装成扩展方法。
发布于 2020-04-19 10:17:48
得到默认值0,因为它是int的默认值(不可为空)。
要获得null的默认值,请将字典中值的类型更改为int? (可空):
var products = new Dictionary<Guid, int?>
{
{ Guid.NewGuid(), 1 },
{ Guid.NewGuid(), 2 },
{ Guid.NewGuid(), 3 },
};https://stackoverflow.com/questions/61302648
复制相似问题