Как извлечь наиболее распространенный ГОД из массива объектов DateTime с помощью LINQ

2

im пытается извлечь наиболее распространенный YEAR из массива объектов DateTime, используя LINQ.

Может кто-нибудь мне помочь? Следуя его словам, мне нужно реализовать IComparable..

            DateTime modeDate = (from c in dates 
                                 group c by c.Year into g 
                                 select g).Max().First();
Теги:
linq
datetime
syntax
grouping

4 ответа

3
Лучший ответ
int commonYear = dates.GroupBy(date => date.Year)
                      .OrderByDescending(g => g.Count())
                      .First().Key;
  • 2
    Это прекрасно работает, но это неоднозначно, когда есть более одного года с одинаковой максимальной частотой. Конечно, оригинальный вопрос не дает никаких подсказок о том, как им нужно решить эту часть, но это потенциальный вопрос.
  • 0
    @ Майк Два - Отличный вопрос, я не думал об этом (что касается меня :)).
2

Я думаю, вы довольно близки.

var dateUsedMostOften = (from d in dates
                         group d by d.Year into y
                         orderby y.Count() descending
                         select y).First().Key;

непроверенная. Посмотрите, работает ли это.

Примечание. Если в списке нет элементов, это, вероятно, не удастся. Вы можете обойти это, вызвав FirstOrDefault(), а затем проверить, вернул ли он null. Ищите только .Key, если вы знаете, что это не пусто.

  • 1
    Это вернет группировку. Вы хотите сделать .First().Key , который будет возвращать int соответствующий наиболее распространенному году.
  • 0
    Да, хороший момент. Я обновлю его, чтобы не запутывать новых читателей.
2

Эта часть вашего запроса

from c in dates 
    group c by c.Year into g 
    select g

возвращает IGrouping<int, DateTime> и не реализует ICompareable

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

1

Это должно выполнить эту работу.

        List<DateTime> list = new List<DateTime> ();
        list.Add (DateTime.Parse ("2002 Jan 01"));
        list.Add (DateTime.Parse ("2003 Jan 01"));
        list.Add (DateTime.Parse ("2004 Jan 01"));
        list.Add (DateTime.Parse ("2005 Jan 01"));
        list.Add (DateTime.Parse ("2004 Jan 01"));
        list.Add (DateTime.Parse ("2004 Jan 01"));
        list.Add (DateTime.Parse ("2007 Jan 01"));

        int year = list.Select (d => d.Year)
            .GroupBy (y => y)
            .OrderBy (g => g.Count ())
            .Last ()
            .Key;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню