Devi tenere sempre presente che una espressione LINQ, creata usando uno dei tanti suoi metodi (es. Where()), crea come risultato un oggetto che rappresenta l'espressione stessa.
Quando scrivi
stai creando un oggetto che rappresenta una espressione, sempre valorizzata, la quale partendo da un dizionario quindi da un contenitore di coppie chiave/valore, andrebbe a recuperare solo gli elementi che soddisfano un filtro (dato dall'uso di Where()) il quale indica che la chiave di tipo intero deve essere inferiore a 2.codice:mioDict.where(Function(l) l.Key < 2 )
Questo indicato sopra è tutto ciò che ottieni come valore di ritorno dall'espressione che tu hai scritto.
Uso infatti il termine "andrebbe" perché finché non viene eseguita in qualche modo, quella espressione rimane tale e non calcola né estrae né filtra nulla, fino a quando non viene attivata.
Ottieni quindi una espressione che, sottoposta a enumerazione (es. ciclo For, chiamate a ToList(), ToArray(), oppure First(), Last() oppure ancora ToDictionary(), Count(), ecc.), viene eseguita in quel momento e produce i risultati richiesti effettivamente.
Riassumendo quindi, di sicuro l'espressione non produce un dizionario automaticamente, quindi l'assegnazione che hai fatto a una variabile di tipo Dictionary(Of Integer, String) è sbagliata. Come giustamente indicato nell'errore, il valore del tipo di ritorno è una "enumerazione di oggetti KeyValuePair". Se vuoi eseguire l'espressione e accedere ai risultati, devi quindi leggere il primo valore estraendolo dall'enumerazione e passando ai successivi, con una delle tecniche indicate sopra. Se vuoi ottenere un dizionario con i valori estratti, allora usa il metodo ToDictionary().
Tieni inoltre conto che il valore restituito potrebbe essere una interfaccia, es. IDictionary, ma in questi casi il mio suggerimento è quello di sfruttare la Type Inference ossia dichiarare la variabile facendole assumere automaticamente il tipo restituito dall'espressione, senza indicarlo.
Riepilogando, il codice va trasformato in questo modo:
Un consiglio: documentati bene su LINQ e su come si usa.codice:Dim newDict = mioDict.where(Function(l) l.Key < 2 ).ToDictionary()
Ciao!![]()


Rispondi quotando