我正在使用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
答案 0 :(得分:4)
我在VB失败,但在C#中你会调用centersList和goalieList上的ToList()。
类似于:
playersList.AddRange(centersList.ToList())
playersList.AddRange(goalieList.ToList())
答案 1 :(得分:1)
你有两个球员课程的机会吗?否则,我看不出你怎么可能得到那个错误信息。
查看Reflector,WhereSelectEnumerableIterator实现IEnumerable,因此转换应该成功。