2011-02-08 14 views
15

Tengo una lista de identificadores almacenados correctamente en una lista <>. Ahora necesito Agrupar esta lista y obtener un recuento de la cantidad de incidentes ordenados descendiendo.LINQ: orden por recuento de elementos únicos en la lista <string>

Ejemplo:

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

produciría:

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

Esto sería fácil de TSQL, pero me gustaría evitar la ida y vuelta del servidor, tablas innecesarias, etc., si es posible.

Gracias de antemano.

Actualización: La conversión VB.NET la respuesta de Ralph Shillington a continuación:

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

result.Dump() 
+1

que mencionas T-SQL ... ¿Quiere decir, todos estos datos se encuentra en la base de datos? ¿Por qué no buscarlo ya agrupado y ordenado? ¿O estoy malentendiendo algo? –

Respuesta

18
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(); 

cortar y pegar que en LINQPad y usted debe ser bueno para ir.

También podría escribirse usando expresiones lambda como:

aryIDs.GroupBy (id => id).OrderByDescending (id => id.Count()).Select(g => new { Id=g.Key, Count=g.Count()}).Dump(); 
+0

Perfecto, gracias. Incluso lo actualizaste antes de que pudiera preguntar por el género. :) –

+0

@Ralph: ¿Cuál es el equivalente de esta declaración de consulta en la expresión Lambda? –

+0

@santosh - actualicé la respuesta para incluir también una expresión Lambda. –

Cuestiones relacionadas