linq выбирает много дат

#c# #linq

#c# #linq

Вопрос:

Я работаю над созданием этой viewmodel, но я не уверен, как выбрать все ListOfMeetingDates в этом примере ниже. Мне также нужно отформатировать строку в полный месяц. Любая помощь была бы отличной.

 List<Meeting> Meeting = new List<Meeting>();
List<MeetingDates> ListOfMeetingDates = new List<MeetingDates>();
ListOfMeetingDates.Add(new MeetingDates() { MeetingDatesId = 1, StartDate= "11-1-2020"});
ListOfMeetingDates.Add(new MeetingDates() { MeetingDatesId = 2, StartDate = "11-2-2020" });
Meeting.Add(new Meeting() { Meetingid = 1, MeetingName="a",ListOfMeetingDates= ListOfMeetingDates });
ListOfMeetingDates.Clear();
ListOfMeetingDates.Add(new MeetingDates() { MeetingDatesId = 3, StartDate = "11-5-2020" });
Meeting.Add(new Meeting() { Meetingid = 2, MeetingName = "b", ListOfMeetingDates = ListOfMeetingDates });

var listOfMeetings = Meeting
.Select(x => new MeetingViewModel
    {
    MeetingName = x.MeetingName,
    MeetingDate = x.ListOfMeetingDates.SelectMany(z => z.StartDate)
    }).ToList();


        class Meeting
        {
            public int Meetingid { get; set; }
            public string MeetingName { get; set; }

            public List<MeetingDates> ListOfMeetingDates { get; set; }
        }

        class MeetingDates
        {
            public int MeetingDatesId { get; set; }
            public string StartDate { get; set; }
        }



        class MeetingViewModel
        {
            public string MeetingName { get; set; }
            public string MeetingDate { get; set; }
        }
 

Вывод, который я ищу

 MeetingName = a
MeetingDate = November 1 2020 - November 2 2020
MeetingName = b
MeetingDate = November 5 2020
 

Комментарии:

1. Вы ищете Enumerable.Max , как в var latestDate = ListOfMeetingDates.Max(m => m.StartDate); ? W.r.t. «полные месяцы», посмотрите на пользовательские строки формата даты и времени .

Ответ №1:

Будет ли это работать?

Чтобы получить только начальную и конечную даты в строке

 var listOfMeetings = Meeting
  .Select(x => new MeetingViewModel
      {
      MeetingName = x.MeetingName,
      MeetingDate = GetDateRangeFormatted(x.MeetingDates)
      })
  .ToList();

private string GetDateRangeFormatted(IEnumerable<MeetingDates> meetingDates)
{
    if (meetingDates.Count() == 0)
        return String.empty;

    if (meetingDates.Count() == 1)
        return meetingDates.First().StartDate;

    // this will only work if the dates are sorted correctly
    return $"{meetingDates.First().StartDate} - {meetingDates.Last().StartDate}";
}
 

Чтобы получить все даты в строке

 var listOfMeetings = Meeting
  .Select(x => new MeetingViewModel
      {
      MeetingName = x.MeetingName,
      MeetingDate = string.Join(
          " - ", 
          x.ListOfMeetingDates.Select(d => d.StartDate)
      })
  .ToList();

 

Однако я бы рекомендовал немного изменить вашу модель, чтобы вы могли лучше манипулировать датами / форматировать даты:

 class MeetingDates
{
    public int MeetingDatesId { get; set; }
    public DateTime StartDate { get; set; } // notice DateTime instead of string
}
 

Комментарии:

1. что делать, если в коллекции есть три даты начала?

2. Как должен выглядеть ваш вывод в этом случае?

3. Дата собрания = 1 ноября 2020 года — 2 ноября 2020 года — 3 ноября 2020 года

4. о, в таком случае это еще проще — string.Join может помочь, я обновил свой ответ

Ответ №2:

   static void Main(string[] args)
    {
        List<Meeting> Meeting = new List<Meeting>();
        List<MeetingDates> ListOfMeetingDates1 = new List<MeetingDates>();
        ListOfMeetingDates1.Add(new MeetingDates() { MeetingDatesId = 1, StartDate = "11-1-2020" });
        ListOfMeetingDates1.Add(new MeetingDates() { MeetingDatesId = 2, StartDate = "11-2-2020" });
 

Список встреч1.Добавить(новые даты собраний() { Дата собрания = 3, дата начала = «11-3-2020» });
Список встреч1.Добавить(новые даты собраний() { Дата собрания = 4, дата начала = «11-4-2020» });
Список встреч1.Добавить(новые даты собраний() { Дата собрания = 5, дата начала = «11-5-2020» });
Встреча.Добавить(новое собрание() { Идентификатор собрания = 1, имя_представления = «a», список встреч = Список встреч1 });

         List<MeetingDates> ListOfMeetingDates2 = new List<MeetingDates>();

        ListOfMeetingDates2.Add(new MeetingDates() { MeetingDatesId = 3, StartDate = "11-5-2020" });
        Meeting.Add(new Meeting() { Meetingid = 2, MeetingName = "b", ListOfMeetingDates = ListOfMeetingDates2 });

         var expectedOutput = Meeting.Select(e => new MeetingViewModel
        {
            MeetingName = e.MeetingName,
            MeetingDates = e.ListOfMeetingDates.Count == 0 ? string.Empty :
                (e.ListOfMeetingDates.Count == 1 ? DateUtilities.ToStringDateTime(Convert.ToDateTime(e.ListOfMeetingDates[0].StartDate), "MMMM dd yyyy") :
           e.ListOfMeetingDates.Select(md => md.StartDate).Aggregate((s1, s2) =>
           (!s1.Contains(",") ?
           DateUtilities.ToStringDateTime(Convert.ToDateTime(s1), " MMMM dd yyyy") : s1.ToString())
             ","   DateUtilities.ToStringDateTime(Convert.ToDateTime(s2), "MMMM dd yyyy")))
        }).ToList();

        Console.ReadKey();
    }
}



class Meeting
{
    public int Meetingid { get; set; }
    public string MeetingName { get; set; }

    public List<MeetingDates> ListOfMeetingDates { get; set; }
}

class MeetingDates
{
    public int MeetingDatesId { get; set; }
    public string StartDate { get; set; }
}



class MeetingViewModel
{
    public string MeetingName { get; set; }
    public string MeetingDates { get; set; }
}

public static class DateUtilities
{
    public static string ToStringDateTime(DateTime dateTime, string format)
    {
        return dateTime.ToString(format);
    }
}
 

Комментарии:

1. что делать, если в списке дат встречи есть три значения?