Как извлечь наиболее распространенный ГОД из массива объектов DateTime с помощью LINQ - PullRequest
2 голосов
/ 10 февраля 2010

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

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

            DateTime modeDate = (from c in dates 
                                 group c by c.Year into g 
                                 select g).Max().First();

Ответы [ 4 ]

3 голосов
/ 10 февраля 2010
int commonYear = dates.GroupBy(date => date.Year)
                      .OrderByDescending(g => g.Count())
                      .First().Key;
2 голосов
/ 10 февраля 2010

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

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

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

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

2 голосов
/ 10 февраля 2010

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

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

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

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

1 голос
/ 10 февраля 2010

Это должно сделать работу.

        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;
...