Linq: Come trasformare righe da colonne con un conteggio (dati campi incrociati)?

StackOverflow https://stackoverflow.com/questions/2405249

  •  18-09-2019
  •  | 
  •  
È stato utile?

Soluzione

Si dispone di una fila di classe / SQL

class Thing
{
    public string EventName;
    public DateTime WhenItHappend;
}

e si desidera eseguire il raggruppamento EventName e WhenItHappened.Month

// make a collection and add some Things to it
var list = new List<Thing>();
list.Add(new Thing(){ .... });
// etc

var groups = list.GroupBy(t => new { t.WhenItHappend.Month, t.EventName } );

Ora avete essenzialmente un array bidimensionale 2 di collezioni. È possibile scorrere questi su Mese / EventName per ottenere i conteggi degli elementi in ogni collezione, che è ciò che si desidera visualizzare nella tabella.

foreach (var row in groups.GroupBy(g => g.Key.EventName))
{
    foreach (var month in row.GroupBy(g => g.Key.Month))
    {
        var value = month.Count();
    }
}

L'operatore GroupBy restituisce un insieme di gruppi, dove ogni gruppo contiene una chiave e un sottoinsieme della lista originale che corrisponde alla chiave specificata. Se si specifica una chiave dimensionale 2, è possibile trattare il risultato come un array bidimensionale 2 di collezioni.

GroupBy è un operatore molto potente!

scroll top