#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. что делать, если в списке дат встречи есть три значения?