2012-05-30 18 views
18

Tengo una lista que contiene solo cadenas. Lo que me gustaría hacer es agruparme y devolver un conteo.GroupBy y cuente los elementos únicos en una lista

Por ejemplo:

Foo1 
Foo2 
Foo3 
Foo1 
Foo2 
Foo2 

Daría lugar a foo1: 2, Foo2: 3, foo3: 1. He intentado con LINQ pero la lista tiene un GroupBy que podrían hacer el truco, pero lo ensucié arriba, no puede entender el uso :(

Respuesta

34
var list = new List<string> { "Foo1", "Foo2", "Foo3", "Foo2", "Foo3", "Foo3", "Foo1", "Foo1" }; 

var grouped = list 
    .GroupBy(s => s) 
    .Select(group => new { Word = group.Key, Count = group.Count() }); 
+0

¡Impresionante, gracias! – Jason94

5
var items= myList 
    .GroupBy(g => g) 
    .Select(t => new {count= t.Count(), key= t.Key }); 

foreach (var group in items) 
    Console.WriteLine (group.key + " " + group.count); 
1
var grouped = select new 
    { 
     Foo= grp.Key, 
     Bar= grp.Select(x => x.SomeField).Distinct().Count() 
    }; 

un ejemplo de trabajo con la base de datos Neptuno por lo que se puede comprobar ::

NWindCustomersDataContext dc = new NWindCustomersDataContext(); 


    var query = (from c in dc.Customers 
       join o in dc.Orders on c.CustomerID equals o.CustomerID 
       group o by c.CustomerID into g 
       select new 
       { 
        CustomerID = g.Key, 
        Company = (from cust in dc.Customers 
           where cust.CustomerID == g.Key 
           select cust).ToList(), 
        Count = g.Select(x => x.OrderID).Distinct().Count() 
       }).OrderByDescending(y => y.Count); 




    foreach (var item in query) 
    { 
     Response.Write("CustomerID: " + item.CustomerID + "</br>" + "CompanyName: " + item.Company[0].CompanyName.ToString() + "</br>"); 


    } 

Here se puede encontrar un ejemplo muy bueno

Cuestiones relacionadas