im пытается извлечь наиболее распространенный YEAR из массива объектов DateTime, используя LINQ.
Может кто-нибудь мне помочь? Следуя его словам, мне нужно реализовать IComparable..
DateTime modeDate = (from c in dates
group c by c.Year into g
select g).Max().First();
int commonYear = dates.GroupBy(date => date.Year)
.OrderByDescending(g => g.Count())
.First().Key;
Я думаю, вы довольно близки.
var dateUsedMostOften = (from d in dates
group d by d.Year into y
orderby y.Count() descending
select y).First().Key;
непроверенная. Посмотрите, работает ли это.
Примечание. Если в списке нет элементов, это, вероятно, не удастся. Вы можете обойти это, вызвав FirstOrDefault(), а затем проверить, вернул ли он null. Ищите только .Key, если вы знаете, что это не пусто.
.First().Key
, который будет возвращать int
соответствующий наиболее распространенному году.
Эта часть вашего запроса
from c in dates
group c by c.Year into g
select g
возвращает IGrouping<int, DateTime>
и не реализует ICompareable
другие люди предоставили хорошие ответы на запрос, который вы хотите, но я подумал, что вам может понадобиться знать, откуда появилась исходная ошибка.
Это должно выполнить эту работу.
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;