2017-02-09 6 views
2

Я создал рефакторинг при этом методе. прежде чем у нас было много циклов и фиктивный код. Это как можно дальше, но я думаю, что я мог бы намного проще.Linq groupBy Перегруппировка в список <> простым/чистым способом

Я думаю, что я мог бы направить из группы * &, выбрав правильный список.

Возможно ли это? или у меня должен быть этот цикл?

private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches) 
{ 
    List<ESMatchDate> lMatchDates = new List<ESMatchDate>(); 

    if (null != matches && matches.Any()) 
    { 
     var dates = from ESMatch in matches 
       group ESMatch by ESMatch.BeginDate.ToShortDateString() into newGroup 
       orderby Convert.ToDateTime(newGroup.Key) 
       select newGroup; 

     foreach (var d in dates) 
      lMatchDates.Add(new ESMatchDate 
       { Date = Convert.ToDateTime(d.Key), Matches = d.ToList()}); 

    } 
    else 
     lMatchDates = null; 

    return lMatchDates; 
} 
+1

Возможно, лучше всего спросить в codereview.stackexchange.com –

+1

Кстати, я предполагаю, что 'BeginDate' является переменной DateTime и вы хотите усечь время. Ваш подход через строку и преобразование не очень хорош, используйте: 'group ESMatch by ESMatch.BeginDate.Date в newGroup'. Тогда вам не нужно делать какие-либо преобразования –

ответ

2

Просто сделать проекцию в select:

private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches) 
{ 
    if (matches == null || !matches.Any()) 
    { 
     return null; 
    } 

    return (from ESMatch in matches 
      group ESMatch by ESMatch.BeginDate.Date into newGroup 
      orderby Convert.ToDateTime(newGroup.Key) 
      select new ESMatchDate 
      { 
       Date = newGroup.Key, 
       Matches = newGroup.ToList() 
      }).ToList(); 
} 
+1

, идущие туда и обратно в строку даты, немного устарели. Просто выполните 'ESMatch.BeginDate.Date' – Jamiec

+0

Незначительную проблему, OP хочет вернуть список, даже если ваш подход компилируется, это не то же самое. –

+0

@Jamiec - Спасибо :) исправлено –

5

Ты так близко, но вам не нужно вручную Add к списку - LINQ может сделать все это для вас

private IEnumerable<ESMatchDate> groupBydate(IEnumerable<ESMatch> matches) 
{ 

    if (null == matches || !matches.Any()) 
    { 
     return null; 
    } 
    return matches.GroupBy(x => x.BeginDate.Date) 
        .OrderBy(x => x.Key) 
        .Select(x => new ESMatchDate{ Date = x.Key, Matches = x.ToList() }) 
        .ToList(); 
} 

Обратите внимание, что это аналогично предыдущему ответу, просто используя синтаксис Lamda вместо сравнения. Я лично предпочитаю этот синтаксис, но это вопрос вкуса.

+0

просто отлично. Благодарю. веселит. – 2Fast4YouBR

 Смежные вопросы

  • Нет связанных вопросов^_^