LINQ-to-List和IEnumerable问题

时间:2009-09-19 19:23:35

标签: vb.net linq linq-to-xml ienumerable

我正在使用LINQ-to-XML查询HTML文件。它看起来像这样:

<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 [运动员]'

如您所见,我可能根本不知道如何使用所有这些对象/类。有没有人对我可能做错了什么以及如何解决它有任何见解?

已解决: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 个答案:

答案 0 :(得分:4)

我在VB失败,但在C#中你会调用centersList和goalieList上的ToList()。

类似于:

playersList.AddRange(centersList.ToList())
playersList.AddRange(goalieList.ToList())

答案 1 :(得分:1)

你有两个球员课程的机会吗?否则,我看不出你怎么可能得到那个错误信息。

查看Reflector,WhereSelectEnumerableIterator实现IEnumerable,因此转换应该成功。