C #: невозможно добавить существующий объект словаря в объект viewmodel

#c#

#c#

Вопрос:

Я реализую viewmodel в своем контроллере c # и у меня проблема с добавлением заполненного словаря к объекту viewmodel

Мой viewmodel FundPerformanceVM выглядит следующим образом

 public class FundPerformanceVM
    {
        public FundPerformanceVM()
        {
            TrackRecord = new List<TrackRecordVM>();
        }

        public int FundId { get; set; }
        public string FundName { get; set; }
        public List<TrackRecordVM> TrackRecord { get; set; }
        public Dictionary<int, List<Tuple<string, double, double>>> FundStatistics { get; set; }

    }
  

Ниже приведен код, в котором я заполняю viewmodel. Если вы заметили, что я вызываю

  fundStatistics = GetRiskMatrixByFunds(fundPerformance);
  

Мне нужно добавить это в объект viewmodel. Я получаю ошибку, когда я делаю

  fundPerformance.Add(fundStatistics);
  

Метод GetFundPerformance

 private List<FundPerformanceVM> GetFundPerformance(Dictionary<int, IEnumerable<FUND_PERFORMANCE>> allPerformance, DateTime currentMonth)
        {
            var fundPerformance = new List<FundPerformanceVM>();
            Dictionary<int, List<Tuple<string, double, double>>> fundStatistics;

            foreach (KeyValuePair<int, IEnumerable<FUND_PERFORMANCE>> entry in allPerformance)
            {
                var lastRecord = entry.Value.Where(x => x.VALUEDATE <= currentMonth).FirstOrDefault();
                if (lastRecord == null) continue;

                var performance = entry.Value.GroupBy(x => x.VALUEDATE.Year).ToList();
                var fundTrackRecord = new FundPerformanceVM();
                fundTrackRecord.FundId = entry.Key;
                fundTrackRecord.FundName = entry.Value.FirstOrDefault() != null ? entry.Value.FirstOrDefault().TRACK_RECORD_HEADER.FUND.NAME_TEXT : string.Empty;

                if (!performance.Any()) return fundPerformance;

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

                    fundTrackRecord.TrackRecord.Add(model);
                }

                fundPerformance.Add(fundTrackRecord);
                fundStatistics = GetRiskMatrixByFunds(fundPerformance);

                fundPerformance.Add(fundStatistics);
            }
            return fundPerformance;
        }
  

Метод GetRiskMatrixByFunds

          private Dictionary<int, List<Tuple<string, double, double>>> GetRiskMatrixByFunds(List<FundPerformanceVM> fundTrackRecord)
        {

            Dictionary<int, IEnumerable<double>> returnsList = new Dictionary<int, IEnumerable<double>>();
            Dictionary<int, List<Tuple<string, double, double>>> list = new Dictionary<int, List<Tuple<string, double, double>>>();
            List<Tuple<string, double, double>> list1 = null;
            RiskMatrix riskMatrix = new RiskMatrix();
            List<TrackRecordVM> trackRecordVm;
            int fundId;
            (double Monthly, double Annual) arithmeticMean;
            (double Monthly, double Annual) averageGain;
            (double Monthly, double Annual) averageLoss;



            foreach (var trackRecord in fundTrackRecord)
            {
                trackRecordVm = trackRecord.TrackRecord;
                fundId = trackRecord.FundId;

                var jan = trackRecordVm.Select(x => x.Jan).ToList();
                var feb = trackRecordVm.Select(x => x.Feb).ToList();
                var mar = trackRecordVm.Select(x => x.Mar).ToList();
                var apr = trackRecordVm.Select(x => x.Apr).ToList();
                var may = trackRecordVm.Select(x => x.May).ToList();
                var jun = trackRecordVm.Select(x => x.Jun).ToList();
                var jul = trackRecordVm.Select(x => x.Jul).ToList();
                var aug = trackRecordVm.Select(x => x.Aug).ToList();
                var sep = trackRecordVm.Select(x => x.Sep).ToList();
                var oct = trackRecordVm.Select(x => x.Oct).ToList();
                var nov = trackRecordVm.Select(x => x.Nov).ToList();
                var dec = trackRecordVm.Select(x => x.Dec).ToList();

                var monthData = new List<double?>();
                monthData.AddRange(jan);
                monthData.AddRange(feb);
                monthData.AddRange(mar);
                monthData.AddRange(apr);
                monthData.AddRange(may);
                monthData.AddRange(jun);
                monthData.AddRange(jul);
                monthData.AddRange(aug);
                monthData.AddRange(sep);
                monthData.AddRange(oct);
                monthData.AddRange(nov);
                monthData.AddRange(dec);


                var finalMonthList = monthData.Where(f => f.HasValue).Select(f => f.Value);

                returnsList.Add(fundId, finalMonthList);


            }
  

Комментарии:

1. Пожалуйста, добавьте сообщение об ошибке, чтобы мы могли взглянуть

2. fundPerformance это список виртуальных машин fundStatitics , это словарь.

3. не удается преобразовать Dictionary в FundPerformanceVM

Ответ №1:

Посмотрите на типы данных, подразумеваемые вашим использованием:

 fundStatistics = GetRiskMatrixByFunds(fundPerformance); 
  

fundStatistics следовательно, является Dictionary<int, List<Tuple<string, double, double>>> , и fundPerformance является List<FundPerformanceVM>

 fundPerformance.Add(fundStatistics);
  

Вы пытаетесь добавить Dictionary<int, List<Tuple<string, double, double>>> в List<FundPerformanceVM> , что, очевидно, запрещено.

Неясно, каковы отношения между этими переменными и свойствами FundPerformanceVM класса, чтобы знать, что нужно изменить, чтобы заставить его даже компилироваться.

Комментарии:

1. У меня есть следующий код в моем контроллере, если это поможет. Я создаю viewmodel здесь и передаю клиенту var vm = new ManagerStrategyPerformanceVM { SummaryPerformance = CreateViewModel (allPerformance, currentMonth), FundPerformance = GetFundPerformance (allPerformance, currentMonth) }; вернуть виртуальную машину;

2. Итак, как вы можете видеть, GetFundPerformance возвращает список типа List<FundPerformanceVM>. Он вернет trackrecord и статистику для каждого элемента в списке

3. Извините, но взаимосвязи все еще не очевидны, и не ясно, почему вам нужно добавить возвращаемое значение в исходный список. Надеюсь, вы видите причину ошибки, но я не вижу очевидного решения.