Странное различие между последовательностью и списком в F # - PullRequest
2 голосов
/ 15 декабря 2010

Я столкнулся со странной проблемой со списками в F #. Я использую XamlXmlReader для создания списка и последовательности, как:

let xaml_reader = XamlXmlReader(filename)
let nodes_seqs = seq { while xaml_reader.Read() do yield xaml_reader }

Этот код работает отлично, но если я сделаю то же самое со списком:

let xaml_reader2 = XamlXmlReader(filename)
let nodes_list = [ while xaml_reader2.Read() do yield xaml_reader2 ]

Список результатов неверен, т. Е. Элемент head последовательности содержит правильные NodeType, LinePosition, LineNumber и т. Д., Но элемент head списка является своего рода мусором с указанием другого места в XAML. Пример:

let head_of_seq = Seq.head nodes_seq
let head_of_list = List.head nodes_list

После того, как у меня есть:

  • head_of_seq.NodeType = NamespaceDeclaration
  • head_of_seq.LineNumber = 2
  • head_of_seq.LinePosition = 2

Но:

  • head_of_list.NodeType = Нет
  • head_of_list.LineNumber = 111
  • head_of_list.LinePosition = 30

XAML-файл сам по себе корректен и сгенерирован Microsoft Bend. Есть какие-нибудь подсказки? Я буду признателен за любую помощь.

Ответы [ 2 ]

4 голосов
/ 15 декабря 2010

Почему вы сами получаете XamlXmlReader из своей последовательности или списка?То есть не следует ли вместо этого использовать yield xaml_reader.Value?

В любом случае вы просто получите последовательность (или список), содержащую один и тот же экземпляр XamlXmlReader много раз.Когда вы выполните итерацию последовательности один раз, она окажется правильной, поскольку читатель продвигается один раз по мере чтения каждого элемента.Однако даже ваша последовательность почти наверняка не делает то, что вы думаете.Например, что произойдет, если вы попробуете это?

let first = Seq.head nodes_seqs
let first2 = Seq.head nodes_seqs

Поскольку XamlXmlReader продвигается при каждом доступе к последовательности, first2 будет указывать на второй элемент (и смотреть наfirst после оценки first2 покажет то же самое).

0 голосов
/ 15 декабря 2010

По сути, список закреплен, а последовательность - лениво. Лучший способ определить последовательность - это взять несколько элементов и вызвать toList () для этого.

Я бы порекомендовал попробовать использовать XElement и связанные с ним классы из пространства имен System.Linq.XML, а затем перейти к устройству чтения XAML, как только вам это будет удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...