Para cada iteración a través de Linq

Soy nuevo en linq y estoy tratando de aprenderlo en tiempo real. El siguiente es un código de vb.net de una de mis aplicaciones:

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

Donde data y data_org son colecciones Observables de tipo Contact.Prime y Contact class respectivamente. ¿Es posible hacer lo anterior con una consulta linq como la siguiente?

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

Pero lo anterior está dando el siguiente error en tiempo de ejecución:

Unable to cast object of type WhereSelectEnumerableIterator`2[BSPLib.ContactLib.Contact,BSPLib.ContactLib.ContactPrime]' to type 'System.Collections.ObjectModel.ObservableCollection`1[BSPLib.ContactLib.ContactPrime]'.

¿Podría por favor guiarme? Gracias.

preguntado el 10 de marzo de 12 a las 16:03

La solución final por respuestas es usarla de esta manera: data = New System.Collections.ObjectModel.ObservableCollection(Of BSPLib.ContactLib.ContactPrime)(From k As BSPLib.ContactLib.Contact In data_org Select k.prime) -

2 Respuestas

Tus data la variable se declara como una ObservableCollection. No hay conversiones implícitas de enumerables a eso. Tendrás que crear una instancia de un ObservableCollection con esos contenidos. Afortunadamente, podrías simplemente pasarlo al constructor.

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

respondido 10 mar '12, 16:03

Gracias, eso funcionó, también supe que este tipo de constructores también están allí, es decir, llaves tras llaves. ¿Podría señalar dónde puedo encontrar un artículo para ese tipo? Gracias por tu tiempo. - surpavan

Bueno el ObservableCollection es una clase genérica. Entonces, el primer conjunto de paréntesis indica el tipo de objetos que contiene la colección. El segundo conjunto de paréntesis son los argumentos reales del constructor. Por lo general, necesitará usar dos conjuntos de paréntesis cuando trate con algo genérico, desde clases e interfaces hasta métodos genéricos también. - jeff mercado

Gracias que se suma a mi comprensión. - surpavan

Esto se debe a que está seleccionando k.prime de su consulta de linq.

El resultado de su consulta será tipo k.prime.

Por lo tanto, cuando intenta lanzar el foreach

foreach k como BSPLib.ContactLib.Contact en data_org no es válido ya que k es de typeof(k.prime)

En su código anterior debe usar

data = Desde k As BSPLib.ContactLib.Contact In data_org Seleccione k

respondido 10 mar '12, 16:03

Gracias. Sin embargo, mi pregunta es obtener solo los objetos k.prime. - surpavan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.