Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

395
Vistas
¿Cómo puedo replicar este código usando la función anónima (lambda)?

Tengo un diccionario anidado que se ve así:

 Dictionary<string, Dictionary<string, int>> users = new Dictionary<string, Dictionary<string, int>>();

La primera cadena es el nombre del usuario, la segunda es el concurso en el que participa y el int es su puntuación. Un usuario puede participar en múltiples concursos.

Mi tarea es encontrar al usuario con la puntuación más alta sumando todos los puntos que tiene. Por ahora usé este código:

 foreach (var user in users) { bestUsers.Add(user.Key, 0); foreach (var contest in user.Value) { bestUsers[user.Key] += contest.Value; } }

Quiero saber cómo hacerlo usando una función anónima que se parece a esto:

 KeyValuePair<string, int> bestUser = users.OrderBy(x => x.Value.Sum());
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

En lugar de un diccionario anidado, puede crear una clase que represente los resultados del Usuario:

 public class UserGameResults { public string Name { get; set; } // the name of the user public int TotalScore { get => GameResults.Select(x => x.Value).Sum(); } // total score of all games, will be calculated every time the property is accessed public Dictionary<string,int> GameResults { get; set; } = new Dictionary<string,int>(); // key is the name of the game, value is the score }

Si usa Dictionary<string,UserGameResults> , obtendrá su resultado más fácilmente:

 var bestResult = users.OrderByDescending(x => x.Value.TotalScore).FirstOrDefault();

Además, Dictionary<string,UserGameResults> le dice mucho más sobre el significado de los datos que Dictionary<string,Dictionary<string,int>> .

over 4 years ago · Santiago Trujillo Denunciar

0

Para que el refactor de código use linq para obtener el diccionario en lugar de los 2 bucles foreach, podría usar algo como esto:

 users.ToDictionary(u => u.Key, u => u.Value.Select(c => c.Value).Sum());

O creo que Sum tomó un selector lambda

 users.ToDictionary(u => u.Key, u => u.Value.Sum(c => c.Value));

debería ser válido

over 4 years ago · Santiago Trujillo Denunciar

0

Utiliza Dictionary<TKey,TValue> cuando necesita almacenar valores con algunas claves únicas asociadas a ellos, y acceder a ellos mediante esa clave es conveniente para usted.

No sé por qué usas el diccionario aquí. Creo que su nombre de usuario no debe ser único. Entonces, si el nombre de usuario no es único, ¿cómo puede almacenar a todos los usuarios en un diccionario? Creo que deberías usar list en lugar de Dictionary.

 Dictionary<string, Dictionary<string, int>> users = new Dictionary<string, Dictionary<string, int>>() { { "A", new Dictionary<string, int>(){ {"sub1", 10}, {"sub2", 20}, {"sub3", 30} } }, { "B", new Dictionary<string, int>(){ {"sub1", 10}, {"sub2", 40}, {"sub3", 30} } } }; var result = users.OrderBy(x => x.Key).ToDictionary(m => m.Key, m => m.Value.Sum(k => k.Value));

Dictionary es bastante rápido, está bien optimizado y ofrece el rendimiento que necesita en la mayoría de los casos. Pero en la mayoría de los casos no importa, el rendimiento de una lista encadenada de pares clave-valor también habría sido suficiente.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda