C # Перебор списка и извлечение определенных данных

#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;
    }
}
  

Я сам предпочитаю второй вариант.