0

I have created a method in c# to return a Tuple. I am having trouble assigning the results to the Tuple.

I have created a Tuple by the name Tuple benchMarkReturns; How to assign values. Currently when i do a benchMarkReturns. , I mean dot, I get Item1 and Item2 properties that are readonly.

If anybody feels there is better way of doing it suggestions are wellcome

Need to call the method in the following foreach loop for fields Bmrk1 and Bmrk2.

I need to assign compoundReturnsBenchMark1 and compoundReturnsBenchMark2 to the tuple

foreach (var p in performance)
                {
                    var model = new TrackRecordVM
                    {
                        Year = p.Key,
                        Jan = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 1) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 1).MTD : null),
                        Feb = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 2) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 2).MTD : null),
                        Mar = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 3) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 3).MTD : null),
                        Apr = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 4) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 4).MTD : null),
                        May = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 5) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 5).MTD : null),
                        Jun = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 6) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 6).MTD : null),
                        Jul = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 7) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 7).MTD : null),
                        Aug = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 8) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 8).MTD : null),
                        Sep = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 9) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 9).MTD : null),
                        Oct = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 10) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 10).MTD : null),
                        Nov = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 11) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 11).MTD : null),
                        Dec = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 12) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 12).MTD : null),
                        YTD = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 12) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 12).YTD : null),
                        Bmrk1 =  ,
                        Bmrk1Name = "Test1",
                        Bmrk2 =  ,
                        Bmrk2Name = "Test2"
                        //Bmrk = (double?)(p.FirstOrDefault(x => x.VALUEDATE.Month == 12) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 12).BENCHMK1_MTD : null),
                        //BmrkName = p.FirstOrDefault(x => x.VALUEDATE.Month == 12) != null ? p.FirstOrDefault(x => x.VALUEDATE.Month == 12).BENCHMK1_INDEX_NAME : null
                    }; 

The method that returns Tuple values

private Tuple<double, double> GetBenchMarkByYear(int year, int benchMark1, int benchMark2)
        {
            Tuple<double, double> benchMarkReturns;
            var benchMark1Returns = GetViewService<MV_INDEX_PERFORMANCE>().Where(x => x.Mtd != null && x.IndexId == benchMark1 && x.PriceDate.Year == year).Select(x => x.Mtd).ToArray();
            var benchMark2Returns = GetViewService<MV_INDEX_PERFORMANCE>().Where(x => x.IndexId == benchMark2 && x.PriceDate.Year == year).Select(x => x.Mtd).ToArray();
            double[] temp1 = benchMark1Returns.Cast<double>().ToArray();
            double[] temp2 = benchMark2Returns.Cast<double>().ToArray();
            var compoundReturnsBenchMark1 = CompoundReturns(temp1);
            var compoundReturnsBenchMark2 = CompoundReturns(temp2);


            return benchMarkReturns;
        }
Tom
  • 8,175
  • 41
  • 136
  • 267
  • 2
    You don't seem to be initialising your return variable (remember that a Tuple is an object) – Steve Todd Apr 10 '19 at 14:47
  • 1
    Tuples are read-only by design. https://stackoverflow.com/questions/3131400/why-tuples-items-are-readonly. If you need something that's mutable you could just use a different class. Or create a new instance of `Tuple`. – Scott Hannen Apr 10 '19 at 14:48
  • `benchMarkReturns = new Tuple(compoundReturnsBenchMark1, compoundReturnsBenchMark2);` – gunnerone Apr 10 '19 at 14:50

2 Answers2

1

return benchMarkReturns; benchMarkReturns is never assigned.

benchMarkReturns = new Tuple<double, double>(compoundReturnsBenchMark1, compoundReturnsBenchMark2);

would solve your issue

SharpNip
  • 350
  • 3
  • 9
0

The problem in your code is that you declared a variable Tuple<double, double> benchMarkReturns but you never assigned to it a value.

So, this should be your method:

private Tuple<double, double> GetBenchMarkByYear(int year, int benchMark1, int benchMark2)
        {
            var benchMark1Returns = GetViewService<MV_INDEX_PERFORMANCE>().Where(x => x.Mtd != null && x.IndexId == benchMark1 && x.PriceDate.Year == year).Select(x => x.Mtd).ToArray();
            var benchMark2Returns = GetViewService<MV_INDEX_PERFORMANCE>().Where(x => x.IndexId == benchMark2 && x.PriceDate.Year == year).Select(x => x.Mtd).ToArray();
            double[] temp1 = benchMark1Returns.Cast<double>().ToArray();
            double[] temp2 = benchMark2Returns.Cast<double>().ToArray();
            var compoundReturnsBenchMark1 = CompoundReturns(temp1);
            var compoundReturnsBenchMark2 = CompoundReturns(temp2);

            Tuple<double, double> benchMarkReturns = new Tuple<double, double>(compoundReturnsBenchMark1 , compoundReturnsBenchMark2);

            return benchMarkReturns;
        }
Dave
  • 1,912
  • 4
  • 16
  • 34