【问题标题】:Is there a way to Translate an array into a dictionary有没有办法将数组翻译成字典
【发布时间】:2019-07-03 15:27:21
【问题描述】:

我遇到的问题是我不确定如何将我的double 数组转换为Dictionary。我有一些很重的 LINQ Where 语句,所以我想使用我的 Dictionary 的键来查找特定值。我有两个带有 getter 和 setter 的类,然后是我的计算器。

我在尝试查找或Dictionary 时摆弄了一下,但没有任何运气。

public class Product
{
    public int EarliestOriginYear { get; set; }
    public int NoOfDevelopmentYears { get; set; }
    public string ProductName { get; set; }
    public IEnumerable<ProductIncrementalValue> ProductIncrementalValues { get; set; }
}

public class ProductIncrementalValue
{
    public string ProductName { get; set; }
    public int OriginYear { get; set; }
    public int DevelopmentYear { get; set; }
    public double IncrementalValue { get; set; }
}

public IList<double> Calculate(Product product)
{
     IList<double> cumulativeDataTriangle = new List<double>();
     if (!product.ProductIncrementalValues.Any())
        return cumulativeDataTriangle;

     for (int i = 0; i < product.NoOfDevelopmentYears; i++)
     {
        // This is what I want to change (where statements)
        var incrementalValues = product.ProductIncrementalValues
            .Where(v => v.OriginYear == product.EarliestOriginYear + i)
            .ToList(); 

        double previous = 0;

        for (int j = 0; j < product.NoOfDevelopmentYears - i; j++)
        {
            // This is what I want to change
            double incrementalValue = incrementalValues.Where(val =>
                val.DevelopmentYear == val.OriginYear + j)
                .Select(x => x.IncrementalValue)
                .FirstOrDefault();

            var tmp = incrementalValue + previous;
            cumulativeDataTriangle.Add(tmp);
            previous = tmp;
        }
     }

     return cumulativeDataTriangle;
}

【问题讨论】:

  • double 不是一个很好的候选者,因为舍入错误:字典可以有,比如 0.9999999999999 键,当你要求它 1.00000000000001 时跨度>

标签: c# arrays dictionary


【解决方案1】:

您可以在循环之前按OriginYearDevelopmentYear 对产品进行分组。这样的事情可能会有所帮助:

public IList<double> Calculate(Product product)
{
    IList<double> cumulativeDataTriangle = new List<double>();
    if (!product.ProductIncrementalValues.Any())
        return cumulativeDataTriangle;

    var lookup = product.ProductIncrementalValues.ToLookup(v => (v.OriginYear, v.DevelopmentYear), v => v.IncrementalValue); 
    for (int i = 0; i < product.NoOfDevelopmentYears; i++)
    {
        var originYear = product.EarliestOriginYear + i;
        double previous = 0;
        for (int j = 0; j < product.NoOfDevelopmentYears - i; j++)
        {
            var developmentYear = originYear + j;
            var incrementalValues = lookup[(originYear, developmentYear)];
            double incrementalValue = incrementalValues.FirstOrDefault();

            var tmp = incrementalValue + previous;
            cumulativeDataTriangle.Add(tmp);
            previous = tmp;
        }
    }

    return cumulativeDataTriangle;
}

【讨论】:

    【解决方案2】:

    感谢上一个答案,我设法基于OriginYearDevelopmentYear 实现了Dictionary,它返回了IncrementalValue

    public IList<double> Calculate(Product product)
            {
                IList<double> cumulativeDataTriangle = new List<double>();
                if (!product.ProductIncrementalValues.Any())
                    return cumulativeDataTriangle;
    
                var lookup = product.ProductIncrementalValues.
                    ToDictionary(v => (v.OriginYear, v.DevelopmentYear), v => v.IncrementalValue);
                for (int i = 0; i < product.NoOfDevelopmentYears; i++)
                {
                    var originYear = product.EarliestOriginYear + i;
                    double previous = 0;
                    for (int j = 0; j < product.NoOfDevelopmentYears - i; j++)
                    {
                        var developmentYear = originYear + j;
                        double incrementalValue;
                        lookup.TryGetValue((originYear, developmentYear), out incrementalValue);
    
                        var tmp = incrementalValue + previous;
                        cumulativeDataTriangle.Add(tmp);
                        previous = tmp;
                    }
                }
    
                return cumulativeDataTriangle;
            }
    

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 2011-01-10
      • 1970-01-01
      • 2021-07-19
      • 2013-10-07
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多