2012-02-03 9 views
13

tengo la siguiente listagrupo LINQ por, ordenado por

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
5 34  66M Keith 
3 55  45Q Jason 
2 45  75W Mike 
4 33  77U Will 

Lo que me gusta hacer es ordenar por ID de ascendente y luego obtener el primer valor del contador, srvid que son idénticos (si lo hay)

lo que la salida sería algo así como:

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
2 45  75W Mike 
3 55  45Q Jason 
4 33  77U Will 

Nota cómo Identificación del 5 se elimina de la lista como Contador y srvid era idéntico a lo que tenía para el ID 1, pero como ID 1 fue primero I 5. eliminado

Esto es lo que yo haría, pero no trabaja

var result = (from ls in list1 
        group ts by new {ls.Counter, ls.SrvID} 
       order by ls.ID 
        select new{ 
          ls.ID, 
          ls.Counter.FirstOrDefault(), 
          ls.SrvID.First, 
          ls.FirstName}).ToList() 
+0

@ChrisWue - Gracias para ajustar el formato. ¿Cómo lo formateó en una tabla? –

+0

Es solo formato de código estándar: sangría por 4 espacios – ChrisWue

Respuesta

27
list1.GroupBy(item => new { Counter = item.Counter, SrvID = item.SrvID }) 
    .Select(group => new { 
     ID = group.First().ID, 
     Counter = group.Key.Counter, 
     SrvID = group.Key.SrvID, 
     FirstName = group.First().FirstName}) 
    .OrderBy(item => item.ID); 
+0

Gracias por su respuesta. ¿Por qué tiene una Primera() junto a Nombre e ID? –

+1

GroupBy le devolverá un contador/SrvID a la búsqueda de elementos, cada miembro de búsqueda tiene una clave (Counter/SrvID) y los elementos asociados. Por lo tanto, para cada grupo de búsqueda, puede extraer Counter/SrvID de la clave, ID y Nombre de la primera coincidencia de cada grupo. –

+0

@ vc74 gracias por su respuesta. ¿Sería capaz de elaborar lo que está sucediendo dentro de la expresión LINQ? – BKSpurgeon

18

Agrupe los registros y elija un ganador de cada grupo.

var query = 
    from record in list1 
    group record by new {record.Counter, record.SrvID } into g 
    let winner = 
    (
    from groupedItem in g 
    order by groupedItem.ID 
    select groupedItem 
).First() 
    select winner; 

var otherQuery = list1 
    .GroupBy(record => new {record.Counter, record.SrvID }) 
    .Select(g => g.OrderBy(record => record.ID).First()); 
+0

Gracias por su respuesta - ¿Puedes aclarar cómo funciona var query = from record en list1? Gracias de nuevo –

+0

La primera línea de esta respuesta es probablemente la mejor manera que he visto para describir el uso de GroupBy en inglés real. – Clint