Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,011

    [vb.net] - Selezionare list(of custom T) con linq

    Ciao a tutti!
    Ormai sono solita filtrare le mie liste usando linq!

    Adesso però mi trovo davanti a un nuovo caso:

    La lista in questione è una lista di classi create da me da zero...e purtroppo lambda non mi pare funzionare.

    Immagino il problema sia sulla struttura della classe.


    La mia classe ha una struttura abbastanza semplice:

    codice:
    Public Class cls_Tilesets
        Private _id As Integer
        Private _nome As String
        Private _lstLivelli As List(Of cls_livelli)
        Public Property id As Integer
            Get
                Return _id
            End Get
            Set(value As Integer)
                _id = value
            End Set
        End Property
        Public Property nome As String
            Get
                Return _nome
            End Get
            Set(value As String)
                _nome = value
            End Set
        End Property
        Public Property lstLivelli As List(Of cls_livelli)
            Get
                Return _lstLivelli
            End Get
            Set(value As List(Of cls_livelli))
                _lstLivelli = value
            End Set
        End Property
    
        Public Sub New(ByVal pssId As Integer, ByVal pssNome As String, ByVal pssLstLiv As List(Of cls_livelli))
            id = pssId
            nome = pssNome
            lstLivelli = pssLstLiv
        End Sub
    End Class
    Public Class cls_livelli
        Public idTileset As Integer
        Public id As Integer
        Public nome As String
        Public Sub New(ByVal _idTileset As Integer, ByVal _id As Integer, ByVal _nome As String)
            idTileset = _idTileset
            id = _id
            nome = _nome
        End Sub
    
    End Class
    Come vedete ha solo 3 proprietà (ID, NOME, LSTLIVELLI).

    Io vorrei poter filtrare un'oggetto cls_Tilesets in base al suo ID dalla mia list(of cls_Tilesets).

    Ho provato con lambda:

    codice:
    dim res as cls_Tilesets = miaLista.where(function(t) t.id=3).single
    ma non va

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254
    Ciao veronica,
    dovresti fare una roba del genere:
    codice:
    dim res as cls_Tilesets = miaLista.Single(function(s) s.lstLivelli.Any(function(a)a.id=3))
    puoi dare un occhiata a questo esempio in azione dove creo una lista e recupero un elemento dalla stessa tramite filtro


    EDIT:
    da notare che se usi single e non ci sono elementi o ne hai più di uno va in errore. In quel caso puoi usare First o FirstOrDefault (o last ecc.) per evitare di andare in errore nel caso serva.
    Ultima modifica di U235; 16-05-2020 a 15:38

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,915
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Io vorrei poter filtrare un'oggetto cls_Tilesets in base al suo ID dalla mia list(of cls_Tilesets).
    Ho provato con lambda:
    codice:
    dim res as cls_Tilesets = miaLista.where(function(t) t.id=3).single
    ma non va
    Io non ho ben capito di che tipo è miaLista.
    Inoltre, qual è l'errore?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Altri link...

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254

    In effetti me lo sono chiesto anche io, ma credo che miaLista sia un qualche tipo di IEnumerable di cls_Tilesets. Il punto è che non ho capito bene quale id voglia controllare, se quelli interni alla proprietà lstLivelli o l'id dell'elemento stesso che itera.
    Quello che ho suggerito io era per controllare nei "figli", ma magari li serve controllare anche il padre stesso, oppure solo il padre...
    Aspetto anche io chiarimenti

  5. #5
    Utente di HTML.it L'avatar di Veronica80
    Registrato dal
    May 2006
    Messaggi
    2,011
    Scusate ragazzi cerco di spiegarmi meglio.

    Io ho una classe creata da me: cls_Tilesets che contiene 3 proprietà pubbliche (Id, Nome, Lista) e creo una nuova list(of T) di quel tipo.

    codice:
    dim miaLista as new list(of cls_Tilesets)
    La lista è correttamente popolata con altre funzioni.

    L'errore è che l'intellisense non mi prende il codice LINQ Lambda quando provo a filtrare la lista.

    Io vorrei fare una cosa del genere:

    codice:
    dim mioTileset as cls_Tilesets = miaLista.where(function(t) t.id=30).single
    ma non me lo fa fare come se miaLista non fosse un IEnumerable!

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,915
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    ma non me lo fa fare come se miaLista non fosse un IEnumerable!
    Hai importato il namespace System.Linq?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Altri link...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,254
    Quote Originariamente inviata da Veronica80 Visualizza il messaggio
    Scusate ragazzi cerco di spiegarmi meglio.

    Io ho una classe creata da me: cls_Tilesets che contiene 3 proprietà pubbliche (Id, Nome, Lista) e creo una nuova list(of T) di quel tipo.

    codice:
    dim miaLista as new list(of cls_Tilesets)
    La lista è correttamente popolata con altre funzioni.

    L'errore è che l'intellisense non mi prende il codice LINQ Lambda quando provo a filtrare la lista.

    Io vorrei fare una cosa del genere:

    codice:
    dim mioTileset as cls_Tilesets = miaLista.where(function(t) t.id=30).single
    ma non me lo fa fare come se miaLista non fosse un IEnumerable!
    Ok, allora dovrebbe essere semplice, a livello di compilazione potrebbe anche passare quello che hai scritto, ma il problema principale è che è inutile scrivere un where seguito da un single per ricavare un singolo elemento, ti porterebbe con buona probabilità ad ottenere un errore che a volte può sembrare random ed essere confuso con altro. Infatti il tuo codice in sostanza prima filtra un gruppo di risultati che idealmente hanno diversi candidati (Where) non necessariamente senza doppioni, successivamente usare single senza ulteriori criteri potrebbe mandare in errore il tutto a causa del fatto che ci sono due o piu candidati, perché single accetta un solo candidato possibile (va in errore anche se non ci sono elementi candidati). Inoltre fai due passaggi e non uno...
    codice:
    miaLista.Single(function(s)d.id=3)
    questo fa lo stesso che facevi prima ma con un passaggio (illogico) in meno.
    Inoltre come suggerito in precedenza potresti usare FirstOrDefault() o LastOrDefault() ecc. per evitare errori in caso di candidati multipli.

    prova ad usare First al posto di Single per vedere se va in errore comunque.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.