向具有元组值的字典中的键添加多个值

Adding more than one value to a Key in a Dictionary with Tuple Values

所以,我正在编写一个处理税收的程序。 我有一个字典,其设置如下:

static Dictionary<Commodity, Tuple<DateTime, double>> _TaxRates = new Dictionary<Commodity, Tuple<DateTime, double>>();

商品是一个枚举,它处理不同的税区(食品、酒精、交通等)。 现在,我想添加一个新的税率,以及添加税率的日期时间。

例如,酒精的税率在 17:00 时可能是 0.25%,但在 17:25 时是 0.50%。

_TaxRates [commodity].Add(new Tuple<DateTime, double>(DateTime.Now, rate));

这给了我一个错误。

_TaxRates[commodity] =  Tuple.Create(DateTime.Now, rate);

这似乎只是覆盖了旧值,这意味着酒精只有一种税率。非常感谢任何帮助或提示。

下面的“完整代码”:

            static Dictionary<Commodity, Tuple<DateTime, double>> _TaxRates= new Dictionary<Commodity, Tuple<DateTime, double>>();
        public void SetCustomTaxRate(Commodity commodity, double rate)
        {
            _TaxRates[commodity].Add(new Tuple<DateTime, double>(DateTime.Now, rate));

A Tuple 仅存储一组值。你想要一个 Dictionary<Commodity, List<Tuple<DateTime, double>> 来代替。

private static readonly Dictionary<Commodity, List<Tuple<DateTime, double>> _TaxRates = new();

public void SetCustomTaxRate(Commodity commodity, double rate)
{
    if (!_TaxRates.TryGetValue(commodity, out var list))
    {
        list = new List<Tuple<DateTime, double>>();
        _TaxRates[commodity] = list;
    }
    
    list.Add(new Tuple<DateTime, double>(DateTime.Now, rate));
}

注意: 根据您的目标框架,您可能需要使用 ValueTuple
Tuple types - C# reference | Microsoft Docs

NB2: 该代码不是线程安全的。您应该锁定该字段,或者改用 ConcurrentDictionary<Commodity, List<(DateTime, double)>>

NB3: 由于您正在使用 DateTime.Now,您应该注意夏令时问题。考虑使用 DateTime.UtcNow 或改用 DateTimeOffset