2011-02-03 12 views
49

Sto cercando di eseguire una query su un elenco esempio di oggettiLinq distinti - Conte

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 

voglio usare LINQ per interrogare l'elenco delle date con il numero di login utente univoci.

Ad esempio:

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

Ho cercato come testato una serie di dichiarazioni LINQ, ma nessuno di questi mi stanno dando il risultato desiderato. Il più vicino che ho è mi dà le date distinte ma con un conteggio di tutti gli utenti.

Qualsiasi aiuto sarebbe molto apprezzato.

+9

Aggiungi le istruzioni LINQ che hai provato, quindi possiamo capire perché si sono sbagliati. –

risposta

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

Sono nuovo di Linq e mi chiedo come si scriverà questo nella sintassi di query di Linq al posto della sintassi del metodo di Linq. – comecme

+1

@comecme Mi rendo conto che hai lasciato questo commento secoli fa, ma controlla la mia traduzione alla sintassi del metodo di seguito. – Kevin

+1

Mi spiace che il tuo codice restituisca sempre Count = 1, questo perché hai aggiunto il Discintinc() e farai contare un elemento. Se lo rimuovi, avrai la quantità di elementi. Spero che questo ti aiuti!!! ;) –

5

Qualcosa di simile forse?

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

Ah dammi che ero così vicino, grazie cercherò di implementarlo a breve. Grazie per la risposta rapida. –

+0

@aspect - in realtà questo ti dà la data con il numero associato di accessi utente unici, dalla tua domanda vuoi raggruppare le date con lo stesso numero di accessi utente unici pure? se è quello che vuoi, allora aggiungi un altro gruppo dopo la selezione del conteggio e sei lì! – theburningmonk

1

Un altro modo per risolvere questo è quello di gruppo due volte, controllare il campione

  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

può essere fatto entro chiamata singola GroupBy,

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

questa è la migliore risposta. Grazie @naveen – JoshYates1980

14

Mi rendo conto che questo è un antico domanda, ma l'ho trovato e ho visto il commento sulla sintassi del metodo e non ho potuto aiutarmi a rispondere ... I può hanno un disturbo di codifica.

Nella sintassi di query che assomiglia a questo ... notare che non v'è alcuna sintassi di query per Distinct e 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() 
}; 

Per un confronto fianco a fianco alla sintassi metodo originale (che personalmente mi piace di più) ecco qui ...

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

Grazie per aver dedicato del tempo per rispondere al mio commento. – comecme