En este caso estaremos viendo una sección de .NET llamada Linq (Language integrated query). Se trata de un conjunto de herramientas para explorar colecciones (arrays, listas, etc.) para obtener elementos o subconjuntos usando lógica. Linq trabaja principalmente con la interfaz genérica IEnumerable<T> que descrine una colección enumerarle de objetos de tipo T.
Con Linq podemos hacer operaciones como agarrar los elementos de la colección que cumplan con ciertas condiciones, ordenar por diferentes atributos, tomar el primer elemento de la colección que cumpla algo, y varias otras cosas.
Las lambda expressions son funciones anónimas declaradas en la línea de ejecución. La estructura de las mismas es definir el nombre de la variable funcional, seguido por el operador de asignacion ‘=>‘ y luego la expresion a evaluar.

Para ver los siguientes ejemplos, vamos a construir una estructura de clases que podríamos ver comunmente en un RPG para manejar el inventario del personaje.

Operación First()
First obtiene el primer resultado de la colección, es lo mismo que hacer items[0], en embargo la función First tiene un overload que recibe una expresion lambda, permitiéndonos obtener el primer resultado filtrado en una colección. También existe FirstOrDefault, que devuelve el primer elemento si se encuentra y si no, devuelve un valor por defecto. En caso de objetos este sería null.




Operación Where()
Where devuelve un subconjunto de la colección original donde todos los elementos cumplen con la condición dada. Noten el tipo que devuelven estas funciones en comparación con las funciones First(), antes devolvíamos un item, ahora devolvemos una colección numerable de items.


Generics
Los generics son clases o funciones que reciben uno o más tipos como parámetro para operar sobre ese tipo. Este tipo es genérico y permite gran maleabilidad para crear acoplamiento entre las clases.
Operación OrderBy()
Bastante auto explicativa, devuelve la colección ordenada por un criterio dado. Esta operación usa IComparable, de manera que podemos crear comparaciones específicas para objetos complejos. También existe OrderByDecending.
Operación Union()
Con Union podemos generar una colección nueva a partir de la unión de dos colecciones, los elementos repetidos se van a pasar como uno solo.
Operación Select() y SelectMany()
Select y SelectMany son operaciones un poco mas complejas, el objetivo de esto es obtener un conjunto de cosas que no necesariamente sean del tipo de la colección original. Con select podemos obtener por ejemplo todos los nombres de los ítems sin tener que recorrer la colección para extraer cada uno.


Encadenación de operaciones
Si notan bien, estos métodos devuelven IEnumerables, por ende podemos encadenar varias operaciones, hacer un Where y luego OrderBy en la misma línea por ejemplo. En este código se muestran dos formas de obtener el ítem con mejor categoría en algo.

En el primer método obtenemos el valor máximo de nivel dentro de los ítems de ese tipo y luego devolvemos el primer ítem cuyo nivel sea igual al máximo.
En el segundo método, ordenamos la lista de ítems y devolvemos el primero.
Ambas maneras son válidas, cuando hablamos de colecciones gigantes, la primera forma es más eficiente que la segunda.
Ejemplo en Unity
¿Como siempre, todo esto es muy útil, pero que uso puede tener en Unity? Bueno de hecho, el manejo de colecciones en juegos es extremadamente común, y si queremos manejar repositorios de recursos en tiempo de ejecución, el buen manejo de colecciones es vital. El siguiente ejemplo es algo que he encontrado sumamente útil y común, se trata de un Spawner, un objeto que inicializa cosas, ya sea enemigos, objetos, powerups, lo que sea, el objeto anida varios otros objetos taggeados como ‘SpawnPoints’ en su jerarquía, y con linq podemos obtener todos esos puntos rápidamente al inicializar el spawner.

De esta manera tenemos nuestra colección armada en la inicialización sin tener que hacerlo manualmente. Lo mejor de todo es que agregar nuevos puntos es tan fácil como duplicar y mover lo que ya tenemos, no se requiere armar referencias ni cambiar nada, el código es completamente automático.