Crear un diccionario en una lista con agrupación


Tengo el siguiente objeto en una lista:

public class DemoClass
{
    public int GroupKey { get; set; }
    public string DemoString { get; set; }
    public object SomeOtherProperty { get; set; }
}

Ahora, quiero crear el siguiente diccionario a partir de él:

Dictionary<int, List<DemoClass>>

Quiero agrupar el List<DemoClass> por la propiedad GroupKey, pero no entiendo cómo se hace esto y algo de ayuda.

Después de pensar un poco, logré el comportamiento necesario con:

var groupedDemoClasses = from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                            group demoClass by demoClass.GroupKey
                            into groupedDemoClass
                            select groupedDemoClass;
var neededDictionary = groupedDemoClass.ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

Pero, hay una manera de hacer esto en una sola declaración?

Author: saluce, 2009-06-02

4 answers

var groupedDemoClasses = (from demoClass in mySepcialVariableWhichIsAListOfDemoClass
                          group demoClass by demoClass.GroupKey
                          into groupedDemoClass
                          select groupedDemoClass).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

Este funcionará !!!

 80
Author: Prashant C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-03 17:23:44

Solo para hacer la sugerencia de mquander concreta:

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .GroupBy(x => x.GroupKey)
                             .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

Lo haría más corto si utilizara nombres de variables más cortos también, por supuesto:)

Sin embargo, ¿puedo sugerir que una búsqueda podría ser más apropiada? Una búsqueda es básicamente un diccionario de una clave a un IEnumerable<T> - a menos que realmente necesite los valores como una lista, hace que el código sea aún más corto (y más eficiente) con la llamada ToLookup :

var groupedDemoClasses = mySpecialVariableWhichIsAListOfDemoClass
                             .ToLookup(x => x.GroupKey);
 177
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:41

Ya lo hiciste de una sola línea. Simplemente ponga el ToDictionary al final de su primera línea. Si desea que sea más corto, utilice la sintaxis de composición funcional en lugar de la sintaxis de consulta.

 6
Author: mquander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-02 05:56:00

Me voy ligeramente fuera de tema aquí, pero llegué a este hilo porque estaba buscando una manera de crear un diccionario de un diccionario en Linq, y la conversación aquí me llevó a la respuesta...

puede usar linq para crear diccionarios de varios niveles, lo que es útil para escenarios en los que tiene más de 1 clave o dimensión por la que desea buscar. El truco es crear un agrupamiento y luego convertirlo en un diccionario, de la siguiente manera:

  Dim qry = (From acs In ActualSales _
             Group By acs.ProductID Into Group _
             Select ProductID, Months = Group.ToDictionary(Function(c) c.Period) _
            ).ToDictionary(Function(c) c.ProductID)

El la consulta resultante se puede utilizar de la siguiente manera:

 If qry.ContainsKey(_ProductID) Then
      With qry(_ProductID)
          If .Months.ContainsKey(_Period) Then
             ...
          End If
      End With
 End If

Espero que esto sea útil para cualquier otra persona que necesite este tipo de consulta.

 2
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-07 13:42:48