#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. Извините, но взаимосвязи все еще не очевидны, и не ясно, почему вам нужно добавить возвращаемое значение в исходный список. Надеюсь, вы видите причину ошибки, но я не вижу очевидного решения.