archivo de datos: (Data.txt) líneas representan width height
C# 4.0 Implícitamente Typed objetos dinámicos
5
6 9
7 2
4 4
C# Código:
var list = new List<dynamic>();
using (var sr = new StreamReader("Data.txt", Encoding.UTF8))
{
list = sr.ReadToEnd().Split('\n').Select(r =>
{
var split = r.Split(' ');
var len = split.Length;
return new {
w = len > 0 ? int.Parse(split[0].Trim()) : 0,
h = len > 1 ? int.Parse(split[1].Trim()) : 0
} as dynamic;
}).ToList();
}
int Area = list.Sum(r => r.h * r.w);
El ejemplo funciona como es. Tuve que hacer algunas cosas no deseadas para que funcione.
Primero tuve que declarar la lista para evitar el uso del ámbito: dado que no tengo un objeto de dimensión tipeado, hice el tipo dinámico (var list = new List<dynamic>()
).
La parte indeseable es convertir el objeto anónimo a una dinámica (as dynamic
). De lo contrario me sale
No se puede convertir implícitamente el tipo
System.Collections.Generic.List<AnonymousType#1>
aSystem.Collections.Generic.List<dynamic>
¿Por qué aparece este error? Sé que una dinámica puede contener un tipo anónimo, ¿es esto un problema con la extensión y la dinámica de ToList()
?
Necesito poder acceder a los elementos de la lista anónima fuera de la instrucción using, como en la última línea que calcula el área.
Solución: Fui con la respuesta de DTB. Evita el uso de una declaración y dinámica de uso en conjunto. ¡Gracias a todos por la entrada!
var list =
(from line in File.ReadLines("Data.txt")
let parts = line.Split(' ')
let width = int.Parse(parts[0])
let height = parts.Length > 1 ? int.Parse(parts[1]) : 0
select new { width, height }).ToList();
¿Por qué utiliza dinámico como este? – ChaosPandion
Uso inapropiado de dinámico. Usted * sabe * el tipo, no hay beneficio para hacerlo dinámico. Use una estructura o Tuple <>. –
Entonces, ¿estás diciendo que no hay forma de hacer esto con un tipo anónimo? –