首页 > 解决方案 > C#:无法将现有字典对象添加到视图模型对象

问题描述

我正在我的 c# 控制器中实现一个视图模型,并且在将填充的字典添加到视图模型对象时遇到问题

我的视图模型 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; }

    }

以下是我填充视图模型的代码。如果你注意到我在打电话

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


            }

标签: c#

解决方案


查看您的使用隐含的数据类型:

fundStatistics = GetRiskMatrixByFunds(fundPerformance); 

fundStatistics因此是 a Dictionary<int, List<Tuple<string, double, double>>>,并且fundPerformance是 aList<FundPerformanceVM>

fundPerformance.Add(fundStatistics);

您正在尝试将 a 添加Dictionary<int, List<Tuple<string, double, double>>>List<FundPerformanceVM>显然不允许的 a 中。

目前尚不清楚这些变量与 FundPerformanceVM类的属性之间的关系是什么,才能知道要更改什么才能使其甚至可以编译


推荐阅读