Файл данных: ( Data.txt ) строки представляют width height
5
6 9
7 2
4 4
C # Код:
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);
Пример работает как есть.Мне пришлось сделать несколько нежелательных вещей, чтобы заставить его работать.
Сначала я должен был объявить список, чтобы избежать использования области видимости - поскольку у меня нет типизированного объекта измерения, я сделал тип динамическим (var list = new List<dynamic>()
).
Нежелательной частью является приведение анонимного объекта к динамическому (as dynamic
).В противном случае я получаю
Не могу неявным образом преобразовать тип System.Collections.Generic.List<AnonymousType#1>
в System.Collections.Generic.List<dynamic>
Почему я получаю эту ошибку?Я знаю, что динамический может содержать анонимный тип, так что это проблема с расширением и динамикой ToList()
Мне нужно иметь доступ к элементам анонимного списка вне оператора using,как в последней строке, которая вычисляет площадь.
Решение: Я пошел с ответом dtb.Это позволило избежать использования заявления об использовании и динамики всего вместе.Спасибо всем за вклад!
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();