Estoy buscando las mejores prácticas para crear colecciones hechas de tipos anónimos.¿Colecciones de tipos anónimos?
Hay varios enfoques - this una y la mayoría de las respuestas en this hilos asumen que toda la colección anónima se puede construir en una sola declaración.
Como los tipos anónimos se usan generalmente para reemplazar las clases que se deben usar para almacenar temporalmente (como se presenta en this SO answer), me gustaría evitar crear y usar una clase para colecciones anónimas, como this post sugiere.
En mi caso, estoy iterando sobre una colección - para cada elemento de la colección me gustaría recopilar objetos relacionados de forma anónima (actuando como una tupla). Necesito que estos tipos anónimos se incluyan en una colección y luego los ordene para seguir trabajando.
Otros enfoques que han considerado:
- utilizar un objeto [] o ArrayList (perder el beneficio del tipo anónimo)
- Creación de una clase de contenedor para los elementos requeridos (eliminando la necesidad de los anónimos tipo)
Este es el único lugar en mi código que necesito tal colección, ¿cuál sería el mejor enfoque?
Información adicional:
estoy trabajando con el legado de .NET 1.1 objetos, por lo que las colecciones que trabajo son colecciones inflexible implementar IEnumerable, y como tal, la mayoría de los métodos de extensión LINQ como .Elija ganaron' t trabajo:
ejemplo de código
foreach (Item item in myItems)
{
foreach (Confirmation confirmation in item.GetConfirmations(true))
{
if (lastParentId != item.ParentId)
{
lastParentId = item.ParentId;
parentObject = new ParentItem(lastParentId);
}
itemHolder = new ArrayList { item, confirmation };
if (parentObject!= null)
{
itemHolder.Add(parentObject.Rate);
}
sortConfirmations.Add(confirmation.Date, itemHolder);
}
}
// Use sortConfirmations
Resolución
Terminé usando un diccionario genérico para juntar los elementos relacionados y usando .OrderBy() para ordenarlos - feo, pero funciona ... y es mejor que el código existente.
Para obtener información; para usar LINQ con colecciones anteriores, use .Cast(), es decir, myItems.Cast - () etc. –