简体   繁体   English

有没有办法将数组翻译成字典

[英]Is there a way to Translate an array into a dictionary

The problem I'm having is that I'm not sure how to translate my double array into a Dictionary .我遇到的问题是我不确定如何将我的double数组转换为Dictionary I have some LINQ Where statements that are pretty heavy, so I wanted to use the keys of my Dictionary to look up a specific value.我有一些非常繁重的 LINQ Where语句,因此我想使用我的Dictionary的键来查找特定值。 I have two classes with getters and setters and then my calculator.我有两个类,分别是 getter 和 setter,然后是我的计算器。

I've fiddled around a bit with trying to make either a lookup or a Dictionary , but didn't have any luck.我在尝试进行 lookup 或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;
}

You could group the products by OriginYear and DevelopmentYear before the loops.您可以在循环之前按OriginYearDevelopmentYear对产品进行OriginYear Something like this might help:像这样的事情可能会有所帮助:

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;
}

Thanks to the previous answer, I managed to implement a Dictionary based on OriginYear and DevelopmentYear , which returns an IncrementalValue .感谢上一个答案,我设法实现了一个基于OriginYearDevelopmentYearDictionary ,它返回一个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;
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM