C# de los fundamentos al dominio — Lección 6
Manipulación de datos con colecciones y LINQ
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Los juegos y aplicaciones almacenan, buscan y clasifican una gran cantidad de datos. Elegir una colección según el propósito y expresar la intención de procesamiento con LINQ dará como resultado un flujo más claro en lugar de un código más corto.
Seleccionar colección
var party = new List<Player>();
var itemById = new Dictionary<int, Item>();
var unlockedIds = new HashSet<int>();
itemById.Add(10, new Item(10, "Potion"));
unlockedIds.Add(10);
List es adecuado para listas ordenadas, Dictionary es adecuado para búsquedas de claves y HashSet es adecuado para determinar la existencia de valores y evitar la duplicación. Si lee una clave que no está en el diccionario con un indexador, se producirá una excepción, por lo que puede usar TryGetValue.
Consultando con LINQ
List<Monster> targets = monsters
.Where(monster => monster.IsAlive)
.OrderBy(monster => monster.Health)
.Take(3)
.ToList();
La intención de seleccionar tres monstruos vivos con poca salud se revela en el orden de cálculo. LINQ crea un nuevo flujo de resultados sin modificar automáticamente la colección original.
ejecución retrasada
IEnumerable<Monster> alive = monsters.Where(monster => monster.IsAlive);
monsters.Add(new Monster());
foreach (Monster monster in alive)
{
Console.WriteLine(monster.Health);
}
La consulta devuelta por Where generalmente se ejecuta en el momento del recorrido. Si el original cambia en el medio, los resultados también pueden cambiar. Para corregir el resultado actual, calcule inmediatamente con ToList().
Consultar costes recurrentes
Las llamadas LINQ no son necesariamente lentas, pero pueden crear iteradores, delegados y colecciones de resultados. Para rutas que se ejecutan miles de veces en cada cuadro, los bucles simples y la reutilización del búfer pueden ser más apropiados.
targets.Clear();
foreach (Monster monster in monsters)
{
if (monster.IsAlive)
{
targets.Add(monster);
}
}
Es mejor crear primero una consulta fácil de leer y cambiar solo las secciones donde se identificaron problemas en las mediciones reales. La clave para las colecciones y LINQ no es tener la sintaxis más corta, sino dejar claro el propósito de almacenar datos y cuándo procesarlos.