Как насчет:
var most = list.GroupBy(i=>i).OrderByDescending(grp=>grp.Count())
.Select(grp=>grp.Key).First();
или в синтаксисе запроса:
var most = (from i in list
group i by i into grp
orderby grp.Count() descending
select grp.Key).First();
, Конечно, при использовании этого неоднократно Вы могли бы добавить дополнительный метод:
public static T MostCommon<T>(this IEnumerable<T> list)
{
return ... // previous code
}
Тогда можно использовать:
var most = list.MostCommon();
Не уверен насчет лямбда-выражений, но я бы
Сортировать список [O (n log n)]
Сканирование список [O (n)] найти самую длинную серию.
Сканируйте снова [O (n)], сообщая о каждом номере, имеющем эту длину серии.
Это потому, что может быть более одного наиболее часто встречающегося числа.
Кто-то попросил решение, где существуют связи. Вот удар в этом:
int indicator = 0
var result =
list.GroupBy(i => i)
.Select(g => new {i = g.Key, count = g.Count()}
.OrderByDescending(x => x.count)
.TakeWhile(x =>
{
if (x.count == indicator || indicator == 0)
{
indicator = x.count;
return true;
}
return false;
})
.Select(x => x.i);
Вот еще один ответ, который кажется быстрым. Я думаю ответ Науфаля , как правило, быстрее, но это может затенить его на длинных последовательностях.
public static IEnumerable<T> Mode<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
var counts = source.GroupBy(t => t, comparer)
.Select(g => new { g.Key, Count = g.Count() })
.ToList();
if (counts.Count == 0)
{
return Enumerable.Empty<T>();
}
var maxes = new List<int>(5);
int maxCount = 1;
for (var i = 0; i < counts.Count; i++)
{
if (counts[i].Count < maxCount)
{
continue;
}
if (counts[i].Count > maxCount)
{
maxes.Clear();
maxCount = counts[i].Count;
}
maxes.Add(i);
}
return maxes.Select(i => counts[i].Key);
}