2009-09-19 109 views
4

我在用LINQ-to-XML查询一个HTML文件。它看起来是这样的:LINQ-to-List和IEnumerable问题

<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> 

我试图做的是在结构,称为玩家的列表中创建这些人喜欢的列表:

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 ([email protected] <> "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 ([email protected] <> "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) 

这样我就可以查询列表,并使用它。但它踢的错误:

Unable to cast object of type 'WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,System.Collections.Generic.IEnumerable 1[Players]]' to type 'System.Collections.Generic.IEnumerable`1[Players]'

正如你所看到的,我可能真的不知道如何使用所有这些对象/类的工作。有没有人对我可能做错了什么以及我如何解决它有什么见解?

议决:LINQ查询需要返回一个IEnumerable的,就像这样:

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

然后用goalieList.ToList

+0

您可以通过几种方法来完成此操作。我的答案是完成你想要的一种方法。您也可以使用Linq的Set操作来创建结果的联合。你也可以构造一个返回结果的查询集合, – Alan 2009-09-19 19:37:20

+0

@Peter Mortensen:好眼睛!我已经修好了,谢谢指出。 – 2010-03-18 17:31:01

+0

aargh,你是对的。现在修好。再次感谢 – 2010-03-18 18:47:12

回答

4

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

因此,像:

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

你给了我一个很好的提示。我相信,我明白了。问题是我有两个选择语句在iEnumerable中创建一个iEnumerable。我将我的代码更改为: Dim goalieList = From l In(from d In players.Elements Where d.Value =“Goalies”Select d.ElementsAfterSelf.TakeWhile(Function(f)f。@ class <>“role”) )选择{.Position =“Goalie”,.Name = l.Value} 然后返回单个iEnumerable的新玩家。 Witht this,我按照你的建议 - playersList.AddRange(goalieList.ToList()) - 它的工作原理! – 2009-09-19 20:02:32

+0

这在VB.net中是一样的。 – dwerner 2011-05-04 16:58:48

1

,你有两名球员类的任何机会呢?否则,我不明白你怎么可能得到这个错误信息。

调查反射器,WhereSelectEnumerableIterator实现IEnumerable,所以投射应该成功。