Вы можете использовать «group by» + «orderby». Подробнее см. LINQ 101
var list = new List<string> {"a", "b", "a", "c", "a", "b"};
var q = from x in list
group x by x into g
let count = g.Count()
orderby count descending
select new {Value = g.Key, Count = count};
foreach (var x in q)
{
Console.WriteLine("Value: " + x.Value + " Count: " + x.Count);
}
В ответ на это сообщение (сейчас удалено):
Если у вас есть список некоторых пользовательских объектов, вам нужно использовать пользовательский компаратор или группировать по определенному свойству.
Также запрос не может отображать результат. Покажите нам полный код, чтобы получить лучшую помощь.
На основании вашего последнего обновления:
У вас есть эта строка кода:
group xx by xx into g
Поскольку xx - это пользовательская объектная система, она не знает, как сравнивать один элемент с другим.
Как я уже писал, вам нужно направлять компилятор и предоставлять некоторые свойства, которые будут использоваться при сравнении объектов или предоставлять собственный компаратор. Вот пример:
Обратите внимание, что я использую Foo.Name в качестве ключа - то есть объекты будут сгруппированы на основе значения Name property.
Есть одна загвоздка - вы рассматриваете 2 объекта как дубликаты на основе их имен, но как насчет Id? В моем примере я просто беру идентификатор первого объекта в группе. Если ваши объекты имеют разные идентификаторы, это может быть проблемой.
//Using extension methods
var q = list.GroupBy(x => x.Name)
.Select(x => new {Count = x.Count(),
Name = x.Key,
ID = x.First().ID})
.OrderByDescending(x => x.Count);
//Using LINQ
var q = from x in list
group x by x.Name into g
let count = g.Count()
orderby count descending
select new {Name = g.Key, Count = count, ID = g.First().ID};
foreach (var x in q)
{
Console.WriteLine("Count: " + x.Count + " Name: " + x.Name + " ID: " + x.ID);
}