#c#
#c#
Вопрос:
Мне нужно перебрать список типа TrackRecordVM и извлечь данные из полей, которые назначены только для имен полей Январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь
Это список, который я просматриваю
public class TrackRecordVM
{
public int Year { get; set; }
public decimal? Jan { get; set; }
public decimal? Feb { get; set; }
public decimal? Mar { get; set; }
public decimal? Apr { get; set; }
public decimal? May { get; set; }
public decimal? Jun { get; set; }
public decimal? Jul { get; set; }
public decimal? Aug { get; set; }
public decimal? Sep { get; set; }
public decimal? Oct { get; set; }
public decimal? Nov { get; set; }
public decimal? Dec { get; set; }
public decimal? YTD { get; set; }
public decimal? Bmrk { get; set; }
public string BmrkName { get; set; }
}
Вот цикл. Каков наилучший способ сделать это
List<TrackRecordVM> trackRecordVm;
foreach (var trackRecord in fundTrackRecord)
{
trackRecordVm = trackRecord.TrackRecord;
foreach (var track in trackRecordVm)
{
}
}
Комментарии:
1. Как насчет того, чтобы попробовать LINQ
2.
extract data from fields that are only assigned to fields names
Рассмотрите возможность уточнения3. Я имел в виду поля январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь
4. Неясно, о чем вы спрашиваете.
5. Я в основном перебираю список, содержащий поля, отличные от названий месяцев. Мне нужно извлекать данные только из полей месяца
Ответ №1:
Вероятно, вам было бы проще с Linq.
Что-то вроде этого (просто повторите это для тех членов, которые вам нужны):
var jan = trackRecordVm.Select(x => x.Jan).ToList();
var dec = trackRecordVm.Select(x => x.dec).ToList();
var newList = new List<decimal?>();
newList.AddRange(jan);
newList.AddRange(dec);
Комментарии:
1. Я попробовал это и получил ошибку, не удается присвоить void переменной типа implicity
2. trackRecordVm = TrackRecord. TrackRecord; 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 может = trackRecordVm.Select(x => x.May). ToList(); var jun = trackRecordVm.Select(x => x.Jun). ToList(); var dec = trackRecordVm.Select(x => x.Dec). ToList(); var monthsData = jan. Добавить диапазон (dec);
Ответ №2:
Мне это не нравится, но вы могли бы сделать именно то, что вы просите, например:
public static void DoIt()
{
TrackRecordVM record = new TrackRecordVM();
string[] months = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "July", "Aug", "Sep", "Oct", "Nov", "Dec" };
foreach (decimal? value in record.GetType().GetRuntimeProperties()
.Where(p => months.Contains(p.Name))
.Select(pi => pi.GetValue(record, null)))
{
//do stuff
}
}
Или вы можете создать перечисляемый объект из своего класса записей, например:
public class TrackRecordVM
{
public decimal? Jan { get; set; }
public decimal? Feb { get; set; }
public decimal? Not { get; set; }
public IEnumerable<decimal?> GetMonths()
{
yield return Jan;
yield return Feb;
}
}
Я сам предпочитаю второй вариант.