LINQ-to-List и IEnumerable проблемы - PullRequest
       24

LINQ-to-List и IEnumerable проблемы

4 голосов
/ 19 сентября 2009

Я запрашиваю файл HTML с LINQ-to-XML. Это выглядит примерно так:

<html>
    <body>
        <div class="Players">
        <div class="role">Goalies</div>
        <div class="name">John Smith</div>
        <div class="name">Shawn Xie</div>
        <div class="role">Right Wings</div>
        <div class="name">Jack Davis</div>
        <div class="name">Carl Yuns</div>
        <div class="name">Wayne Gortonia</div>
        <div class="role">Centers</div>
        <div class="name">Lutz Gaspy</div>
        <div class="name">John Jacobs</div>
        </div>
    </body>
</html>

То, что я пытаюсь сделать, - это создать список таких людей, как в списке структур под названием Players:

Structure Players
    Public Name As String
    Public Position As String
End Structure

Но я быстро понял, что не знаю, что делаю, когда дело доходит до LINQ.

У меня так далеко в моих запросах:

Dim goalieList = From d In player.Elements _
                 Where d.Value = "Goalies" _
                 Select From g In d.ElementsAfterSelf _
                 Take While (g.@class <> "role") _
                 Select New Players With {.Position = "Goalie", _
                         .Name = g.Value}

Dim centersList = From d In player.Elements _
                  Where d.Value = "Centers" _
                  Select From g In d.ElementsAfterSelf _
                  Take While (g.@class <> "role") _
                  Select New Players With {.Position = "Centers", _
                         .Name = g.Value}

Что приводит меня к игрокам по позициям, но тогда я не могу ничего с этим поделать, после этого тип результата будет System.Collections.Generic.IEnumerable(Of System.Collections.Generic.IEnumerable(Of Player))

Я хочу добавить эти два результата в новый список, например:

Dim playersList As List(Of Players) = Nothing
playersList.AddRange(centersList)
playersList.AddRange(goalieList)

Так что я могу затем запросить список и использовать его. Но это пинает ошибку:

Невозможно привести объект типа 'WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,System.Collections.Generic.IEnumerable 1 [Игроки]]' печатать 'System.Collections.Generic.IEnumerable`1 [Игроки]'

Как видите, я действительно не знаю, как работать со всеми этими объектами / классами. Кто-нибудь понимает, что я могу делать неправильно и как я могу это исправить?

RESOLVED : Запрос LINQ должен возвращать один IEnumerable, например:

Dim goalieList = From l In _
                    (From d In players.Elements _
                     Where d.Value = "Goalies" _
                     Select d.ElementsAfterSelf.TakeWhile(Function(f) f.@class <> "role")) _
                  Select New Players With {.Position = "Goalie", .Name = l.Value}

и затем используйте goalieList.ToList

Ответы [ 2 ]

4 голосов
/ 19 сентября 2009

Я терплю неудачу на VB, но в C # вы бы вызвали ToList () для CentersList и goalieList.

Так что-то вроде:

playersList.AddRange(centersList.ToList())
playersList.AddRange(goalieList.ToList())
1 голос
/ 19 сентября 2009

Есть ли шанс, что у вас есть два класса игроков? В противном случае я не вижу, как вы могли бы получить это сообщение об ошибке.

Заглядывая в Reflector, WhereSelectEnumerableIterator реализует IEnumerable, поэтому приведение должно завершиться успешно.

...