LINQ: порядок по количеству уникальных предметов в списке <string> - PullRequest
15 голосов
/ 08 февраля 2011

У меня есть список идентификаторов, правильно хранящихся в списке <>.Теперь мне нужно сгруппировать этот список и получить количество отсортированных вхождений по убыванию.

Пример:

List<string> aryIDs = new List<string>;
aryIDs.Add("1234");
aryIDs.Add("4321");
aryIDs.Add("3214");
aryIDs.Add("1234");
aryIDs.Add("4321");
aryIDs.Add("1234");

Будет производить:

"1234", 3
"4321", 2
"3214", 1

Это будетбыть легким в TSQL, но я хотел бы, если возможно, избежать обхода сервера, ненужных таблиц и т. д.

Заранее спасибо.

Обновление: преобразование VB.NET для ответа Ральфа Шиллингтонаниже:

Dim result = From id In aryIDs _
                     Group id By id Into Group _
                     Order By Group.Count() Descending _
                     Select id, Count = Group.Count()

result.Dump()

Ответы [ 2 ]

19 голосов
/ 08 февраля 2011
List<string> aryIDs = new List<string>();
aryIDs.Add("1234");
aryIDs.Add("4321");
aryIDs.Add("3214");
aryIDs.Add("1234");
aryIDs.Add("4321");
aryIDs.Add("1234"); 

var result =     from id in aryIDs
group id by id into g
orderby g.Count() descending
select new { Id=g.Key, Count=g.Count() };

result.Dump();

Вырежьте и вставьте это в LinqPad, и все будет хорошо.

Он также может быть записан с использованием лямбда-выражений в виде:

aryIDs.GroupBy (id => id).OrderByDescending (id => id.Count()).Select(g => new { Id=g.Key, Count=g.Count()}).Dump();
1 голос
/ 08 февраля 2011

Как насчет http://msdn.microsoft.com/en-us/vcsharp/aa336747#countGrouped:

List<Customer> customers = GetCustomerList();

var orderCounts =
    from c in customers
    select new { c.CustomerID, OrderCount = c.Orders.Count() };
...