对于每次通过Linq的迭代

时间:2012-03-10 16:21:29

标签: linq foreach iterator

我是linq的新手,我正在尝试实时学习它。以下是来自我的某个应用程序的vb.net代码:

    For Each k As BSPLib.ContactLib.Contact In data_org
        data.Add(k.prime)
    Next

其中data和data_org分别是Contact.Prime和Contact类型的Observable集合。 是否可以使用下面的linq查询执行上述操作

data = From k As BSPLib.ContactLib.Contact In data_org Select k.prime

但是上面的代码在运行时会出现以下错误:

Unable to cast object of type WhereSelectEnumerableIterator`2[BSPLib.ContactLib.Contact,BSPLib.ContactLib.ContactPrime]' to type 'System.Collections.ObjectModel.ObservableCollection`1[BSPLib.ContactLib.ContactPrime]'.
你能指导我吗?谢谢。

2 个答案:

答案 0 :(得分:1)

您的data变量被声明为ObservableCollection。枚举没有隐含的转换。您必须使用这些内容创建ObservableCollection的实例。幸运的是,你可以将它传递给构造函数。

Dim query = From k As BSPLib.ContactLib.Contact In data_org Select k.prime
data = New ObservableCollection(Of ContactPrime)(query)

答案 1 :(得分:0)

这是因为您正在从linq查询中选择k.prime。

您的查询结果将是k.prime的类型。

因此,当你试图投射foreach

foreach k作为BSPLib.ContactLib.Contact in data_org无效,因为k是typeof(k.prime)

在上面的代码中,您必须使用

data = from k As BSPLib.ContactLib.Contact in data_org 选择k