none
como buscar el indice de una fila en LinQ RRS feed

  • Pregunta

  • Tengo una duda sobre LinQ, y es la siguiente:
    Después de obtener las filas de una Tabla (en este caso de la tabla de máquinas)
    quisiera poder saber cómo me puedo posicionar en una fila determinada

    ‘Obtiene los registros de la tabla Maquinas.

    Public Function GetTbMaquinas(ByVal empresa As Integer) As IQueryable(Of tbMaquinas)
            Try
                Dim BD = DataContext_ElGre()
                Dim SQL = From Maquina In BD.tbMaquinas
                           Where Maquina.idEmpresa = empresa
                           Order By Maquina.Codigo Ascending
                           Select Maquina
                Return SQL
            Catch ex As Exception
                Return New tbMaquinas()
            End Try
        End Function
    

    Con ésta función recorro la tabla para buscar el índice en que se encuentra el código de la maquina.

    'Busca el registro determinado por el codigo de la Maquina
        Public Function GetCodMaquina(ByVal Valor As Object) As Integer
            Dim indice As Integer = -1
            Dim BD = DataContext_ElGre()
            Dim SQL = (From rg In BD.tbMaquinas
                       Where rg.idEmpresa = empresa
                       Order By rg.Codigo Ascending
                       Select rg).ToList
            indice = SQL.Contains(Valor)
            For i = 0 To SQL.Count - 1
                 'Si encontramos el codigo de la maquina, asignamos el indice y nos 
                 'salimos del bucle
                If SQL.ToList.Item(i).Codigo = Valor Then
                    indice = i
                    Exit For
                End If
            Next
            Return indice
        End Function
    

    ¿Se puede obtener este indice sin tener que hacer un bucle?

    miércoles, 10 de octubre de 2012 12:32

Respuestas

  • Hola,

    es que el método es findIndex (te falta la 'd')

    Tienes más información en el enlace de la MSDN que te pase. 

    http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx#Y0


    Atentamente, Sergio.

    Blog
    Twitter

    • Marcado como respuesta ribe61 miércoles, 17 de octubre de 2012 21:16
    miércoles, 17 de octubre de 2012 18:49

Todas las respuestas

  • No se como sera en VB pero no sera muy diferente de c#, tal que asi:

    var listaMaquinas = GetTbMaquina(codigoEmpresa); //codigoEmpresa es el parametro que te llega

    var maquina = listaMaquinas.FirstOrDefault(maquina => maquina.Codigo == Valor); if(maquina != null) { return listaMaquinas.IndexOf(maquina); } else { // Lo que sea }


    FirstOrDefault devuelve la primera instancia de maquina que coincida con codigo y en caso contrario null.

    Y luego con IndexOf obtienes la posicion de la maquina en la lista. Creo que habrá alguna forma más optima, no sé ahora mismo si IndexOf permite lambda expressions es decir el trozo de codigo dentro del metodo FirstOrDefault


    Vota mi respuesta si te ha sido útil. Gracias.


    miércoles, 10 de octubre de 2012 17:51
  • Gracias David por tu respuesta, he pasado el codigo que me indicas a Vb. pero me da dos errores.

        Public Function GetCodMaquina(ByVal Valor As Object) As Integer
            Dim listaMaquinas = GetTbMaquinas(empresa) 'codigoEmpresa es el parametro que te llegavar
            Dim maquina = listaMaquinas.FirstOrDefault(Function(maquina) maquina.Codigo = Valor)
            If maquina IsNot Nothing Then
                Return listaMaquinas.IndexOf(maquina)
            Else
                ' Lo que sea
            End If
        End Function

    El primer error "Function(maquina)" me indica lo siguiente:

    El parámetro lamdda ´maquina´ oculta una variable en un bloque de inclusión, una variable de rango definida previamente o una variable declarada de forma implicita en una expresion de consulta.

    El segundo error "listaMaquinas.IndexOf(maquina)" me indica:

    'IndexOff' no es un miembro de 'System.LinQ.IQueryable(Of clBDElGre_Datos.tbMaquinas)'.

    jueves, 11 de octubre de 2012 13:46
  • Hola,

    Sobre el primer error es debido a que el nombre de la variable ya esta usado, prueba con:

    Dim maquina = listaMaquinas.FirstOrDefault(Function(maquinaItem) maquinaItem.Codigo = Valor)

    Sobre el error del indice prueba con este codigo tal y como dice en el siguiente enlace, aunque igual son cosas que tiene C# y no VB

    Return listaMaquinas.Position

    http://stackoverflow.com/questions/2471588/how-to-get-index-using-linq

    Te recomiendo este enlace para guiarte en LINQ

    http://msdn.microsoft.com/es-es/library/bb397910.aspx


    Vota mi respuesta si te ha sido útil. Gracias.


    viernes, 12 de octubre de 2012 8:29
  • De nuevo gracias por tu respuesta, pero parece ser que en Vb no admite la propiedad '.Position' puesto que me dice los siguiente:

    'Position' no es un miembro de 'System.LinQ.IQueryable(Of clBDElGre_Datos.tbMaquinas)'

    viernes, 12 de octubre de 2012 17:25
  • Hola,

    yo creo que sería mejor que usaras FindIndex

    Ahora no puedo hacer la prueba pero podrías probar con algo así

    Dim listaMaquinas = GetTbMaquina(codigoEmpresa) 
    Dim index as Integer = listaMaquinas.FindIndex(Function(maquinaItem) maquinaItem.Codigo = Valor)
    Ten en cuenta que index valdrá el índice en base 0 o -1 en caso de no encontrar el elemento.

    Atentamente, Sergio.

    Blog
    Twitter


    • Editado sergiomf martes, 16 de octubre de 2012 7:32
    martes, 16 de octubre de 2012 7:31
  • Hola Sergio, gracias por tu respuesta.

    He probado lo que me indicas pero me dice lo mismo que el mensaje anterior

    'finIndex' no es un miembro de 'System.LinQ.IQueryable(Of clBDElGre_Datos.tbMaquinas)'

    NO puedo creer que obtener el indice para posicionarme en la fila de una tabla tenga que ser a traves de un bucle.

    un saludo.

    miércoles, 17 de octubre de 2012 18:39
  • Hola,

    es que el método es findIndex (te falta la 'd')

    Tienes más información en el enlace de la MSDN que te pase. 

    http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx#Y0


    Atentamente, Sergio.

    Blog
    Twitter

    • Marcado como respuesta ribe61 miércoles, 17 de octubre de 2012 21:16
    miércoles, 17 de octubre de 2012 18:49
  • Hola de nuevo sergiomf, lo tengo de la siguiente manera, lo unico que en el hilo anterior si me ha faltado la 'd'

    Dim maquina = listaMaquinas.findIndex(Function(maquinaItem) maquinaItem.Codigo = Valor)

    voy a ver tu enlace y ya te cuento.

    un saludo.

    miércoles, 17 de octubre de 2012 20:47
  • Hola de nuevo a todos, primero daros las gracias por vuestro interes en ayurdarme. He de decir que parece ser que el siguiente codigo me funciona (digo 'parece' porque quiero hacer mas pruebas).

        Public Function GetCodMaquina(ByVal Valor As Object) As Integer
            Dim BD = DataContext_ElGre()
            Dim ListaTb As New List(Of tbMaquinas)
            Dim SQL = (From rg In BD.tbMaquinas
                       Where rg.idEmpresa = empresa
                       Order By rg.Codigo Ascending
                       Select rg).ToList
            ListaTb = SQL
            Return ListaTb.FindIndex(Function(maquinaItem) maquinaItem.Codigo = Valor)
        End Function
    

    miércoles, 17 de octubre de 2012 21:16