2011-02-03 23 views
49

Busco para realizar una consulta en una lista de ejemplo de objetosLINQ distinta - Contar

Date  Username 

01/01/2011 james 
01/01/2011 jamie 
01/01/2011 alex 
01/01/2011 james 
02/01/2011 matt 
02/01/2011 jamie 
02/01/2011 alex 
02/01/2011 james 
02/01/2011 james 
02/01/2011 lucy 
02/01/2011 alex 
03/01/2011 james 
03/01/2011 bob 
03/01/2011 bob 
03/01/2011 james 
03/01/2011 james 
04/01/2011 alex 
04/01/2011 alex 
04/01/2011 alex 

quiero usar LINQ para consultar la lista de fechas con el número de inicios de sesión de usuario únicas.

Por ejemplo:

01/01/2011 - 3 
02/01/2011 - 5 
03/01/2011 - 2 
04/01/2011 - 1 

he tratado como probado una serie de declaraciones de LINQ pero ninguno de ellos me están dando el resultado deseado. Lo más cercano que tengo es dándome las fechas distintas pero con un recuento de todos los usuarios.

Cualquier ayuda sería muy apreciada.

+9

Agregue esas declaraciones de LINQ que ha intentado, entonces podemos ver por qué salieron mal. –

Respuesta

92
logins 
    .GroupBy(l => l.Date) 
    .Select(g => new 
    { 
    Date = g.Key, 
    Count = g.Select(l => l.Login).Distinct().Count() 
    }); 
+4

Soy nuevo en Linq y me pregunto cómo escribiría esto en la sintaxis de consulta Linq en lugar de la sintaxis del método Linq. – comecme

+1

@comecme Me doy cuenta de que dejó este comentario hace siglos, pero revise mi traducción a la sintaxis del método a continuación. – Kevin

+1

Me temo que su código siempre devolverá Count = 1, eso se debe a que ha agregado el Disctinct() y hará que contar un elemento. Si eliminas eso, tendrás la cantidad de elementos. ¡¡¡Espero que esto ayude!!! ;) –

5

Algo como esto tal vez?

var list = new List<MyClass>(new[] { 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("01/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "matt" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "jamie" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "lucy" }, 
     new MyClass { Date = DateTime.Parse("02/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "bob" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("03/01/2011"), Username = "james" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" }, 
     new MyClass { Date = DateTime.Parse("04/01/2011"), Username = "alex" } 
    }); 

list.GroupBy(l => l.Date, l => l.Username) 
    .Select(g => new { 
       Date = g.Key, 
       Count = g.Distinct().Count() 
      }); 
+0

Ahh, maldición, estaba tan emocionado, gracias, voy a ver cómo implementarlo en breve. Gracias por la rápida respuesta. –

+0

@aspect: en realidad, esto le da la fecha con el número asociado de inicios de sesión de usuario únicos; a partir de su pregunta, ¿desea agrupar las fechas con el mismo número de inicios de sesión de usuario únicos también? si eso es lo que quieres, entonces simplemente agrega otro grupo después de seleccionar por el conteo ¡y estás ahí! – theburningmonk

1

Otra manera de resolver esto es agrupar en dos ocasiones, comprobar la muestra

  var dist = listLogins.GroupBy(d => d.date + d.Username) 
       .Select(x => x.First()) 
       .GroupBy(d => d.date).Select(y => new { date = y.Key, count = y.Count() }).ToList(); 
6

puede hacer dentro de la llamada GroupBy sola,

var Query = list.GroupBy(
       (item => item.DateTime), 
       (key, elements) => new { 
              key = key, 
              count = elements 
                .Distinct() 
                .Count() 
             } 
       ); 
+1

esta es la mejor respuesta. Gracias @naveen – JoshYates1980

14

me di cuenta que es un antiguo pregunta pero lo encontré y vi el comentario sobre querer la sintaxis del método y no pude evitar contestar ... I may tiene un trastorno de codificación.

En la sintaxis de consulta que se parece a esto ... tenga en cuenta que no hay una sintaxis de consulta para Distinct y Count

from l in logins 
group l by l.Date into g 
select new 
{ 
    Date = g.Key, 
    Count = (from l in g select l.Login).Distinct().Count() 
}; 

Para una comparación lado a lado de la sintaxis del método original (que personalmente me gusta más) aquí va ...

logins 
    .GroupBy(l => l.Date) 
    .Select(g => new 
    { 
    Date = g.Key, 
    Count = g.Select(l => l.Login).Distinct().Count() 
    }); 
+1

Gracias por tomarse el tiempo para responder a mi comentario. – comecme