Этот метод несколько раз обновлялся в моем коде на протяжении многих лет.Это стало очень важным методом, и он сильно отличается от того, что было раньше.Я хотел предоставить самую свежую версию на тот случай, если кто-то захочет добавить CopyMost или Modal Average в качестве расширения linq.
Одна вещь, которую я не думал, что мне понадобится, - это что-то вроде разрыва связей.Я перегрузил метод включения тай-брейка.
public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector, Func<K, bool> tieBreaker)
{
var grouped = records.GroupBy(x => propertySelector(x)).Select(x => new { Group = x, Count = x.Count() });
var maxCount = grouped.Max(x => x.Count);
var subGroup = grouped.Where(x => x.Count == maxCount);
if (subGroup.Count() == 1)
return subGroup.Single().Group.Key;
else
return subGroup.Where(x => tieBreaker(x.Group.Key)).Single().Group.Key;
}
Выше предполагается, что пользователь входит в законное состояние тай-брейка.Возможно, вы захотите проверить и проверить, возвращает ли устройство разрешения конфликтов допустимое значение, а если нет, сгенерировать исключение.А вот мой нормальный метод.
public static K CopyMost<T, K>(this IEnumerable<T> records, Func<T, K> propertySelector)
{
return records.GroupBy(x => propertySelector(x)).OrderByDescending(x => x.Count()).Select(x => x.Key).First();
}