Как рассчитать время прохождения для идентификатора приложения? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть ниже

public class ApplicationStatusModel
{
    public int ApplicationId { get; set; }
    public string ApplicationStatus { get; set; }    
    public DateTime CreatedDate { get; set; }
}

, который заполнен некоторыми записями как

List<ApplicationStatusModel> objApplicationStatusModel = new List<ApplicationStatusModel>();

objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 1, ApplicationStatus = "Status1", CreatedDate = new DateTime(2020, 04, 20, 12, 30, 10) });

objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 1, ApplicationStatus = "Status2", CreatedDate = new DateTime(2020, 04, 20, 13, 30, 40) });

objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status1", CreatedDate = new DateTime(2020, 04, 20, 14, 12, 08) });

objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status2", CreatedDate = new DateTime(2020, 04, 20, 15, 30, 10) });

objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status3", CreatedDate = new DateTime(2020, 04, 20, 15, 40, 34) });

Я ищу Время прохождения для идентификатора приложения как

enter image description here

Ниже приведен способ его расчета

// Расчет часов для Status1 = время перехода из Status1 - Status2

// Расчет часов Status2 = время перехода из Status2 в Status3

например

Для идентификатора приложения = 1, статус 1, это 24/04/2020 13:30:40 - 24/04/2020 12:30:10 = 1 час: 30 секунд

Для идентификатора приложения = 2, статус 1 это 24/04/2020 15:30:10 - 24/04/2020 14:12:08 = 1 час: 18 минут: 2 секунды

Для идентификатора приложения = 2, статус 2 это 24/04/2020 15:40:34 - 24/04/2020 15:30:10 = 10 минут: 24 секунды

DTO соответствует

public class TransitReportModel
{
    #region

    public int ApplicationId { get; set; }
    public string StatusName { get; set; }
    public string TransitTime { get; set; }

    #endregion
}

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Может быть, что-то вроде этого

    static void Main(string[] args)
    {
        List<ApplicationStatusModel> objApplicationStatusModel = new List<ApplicationStatusModel>();

        objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 1, ApplicationStatus = "Status1", CreatedDate = new DateTime(2020, 04, 20, 12, 30, 10) });

        objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 1, ApplicationStatus = "Status2", CreatedDate = new DateTime(2020, 04, 20, 13, 30, 40) });

        objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status1", CreatedDate = new DateTime(2020, 04, 20, 14, 12, 08) });

        objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status2", CreatedDate = new DateTime(2020, 04, 20, 15, 30, 10) });

        objApplicationStatusModel.Add(new ApplicationStatusModel { ApplicationId = 2, ApplicationStatus = "Status3", CreatedDate = new DateTime(2020, 04, 20, 15, 40, 34) });


        var List = objApplicationStatusModel
            .Select(x => new { cur = x, next = objApplicationStatusModel.ElementAtOrDefault(objApplicationStatusModel.IndexOf(x) + 1) })
            .Where(x => x.cur.ApplicationId == x.next?.ApplicationId)
            .Select(x=> new TransitReportModel() {
                ApplicationId = x.cur.ApplicationId,
                StatusName = x.cur.ApplicationStatus,
                TransitTime = (x.next.CreatedDate - x.cur.CreatedDate).ToString()
            });
    }


    public class ApplicationStatusModel
    {
        public int ApplicationId { get; set; }
        public string ApplicationStatus { get; set; }

        public DateTime CreatedDate { get; set; }
    }

    public class TransitReportModel
    {
        #region

        public int ApplicationId { get; set; }
        public string StatusName { get; set; }
        public string TransitTime { get; set; }
        #endregion
    }
1 голос
/ 27 апреля 2020

Вы можете сгруппировать исходный список по свойству ApplicationId, затем выполнить итерацию групп, вычислить необходимое время и добавить элементы в список результатов

var grouped = objApplicationStatusModel
    .GroupBy(s => s.ApplicationId);

var result = new List<TransitReportModel>();
foreach (var group in grouped)
{
    for (var i = 0; i < group.Count() - 1; i++)
    {
        var time = group.ElementAt(i + 1).CreatedDate - group.ElementAt(i).CreatedDate;
        result.Add(new TransitReportModel
        {
            ApplicationId = group.Key, StatusName = group.ElementAt(i).ApplicationStatus,
            TransitTime = time.ToString()
        });
    }
}

Использование циклов здесь более понятно и читабельно, скорее добавление вложенных методов Linq, IMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...