Domanda

E 'in qualche modo possibile di utilizzare il 'Con' parola chiave su un oggetto esistente?

Vorrei fare quanto segue utilizzando LINQ to Objects e non riesco a trovare un modo:

From m as Product in Me _
  Select m With {.Match = m.Name.IndexOf(query)} _ 
  Where m.Name.IndexOf(query) > 0
È stato utile?

Soluzione

Non v'è alcun modo di fare questo (With può essere utilizzato solo con un costruttore). Violerebbe i principi di funzionamento su cui si fonda LINQ, in particolare che non ci saranno effetti collaterali.

La cosa migliore è quello di creare un nuovo prodotto nel selezionare con il set di proprietà Match.

From m as Product in Me _
Where m.Name.IndexOf(query) > 0 _
Select New Product() With _
              { _
                  .Match = m.Name.IndexOf(query), _
                  ...apply the rest of m's properties _
              } 

Altri suggerimenti

In VB.Net ci sono due usi della parola chiave With.

Il primo è inizializzazione dell'oggetto. È un mezzo per l'assegnazione delle proprietà o campi di un oggetto nella stessa linea come espressione di inizializzazione, senza la necessità di un costruttore specifico per ogni permutazione dei campi.

Dim x = New Product With {.Name = "Foo"}

Questo tipo di espressione può essere utilizzato solo per creare nuovi oggetti. Non può essere utilizzato per modificare quelli esistenti.

Il secondo uso è la dichiarazione With. Questo permette di inserire un oggetto in un contesto così dire e chiamare molti. operazioni su di esso senza qualifica.

With x
    Console.WriteLine(.Name)
    .Match = 42
End With

Nessuno di questi però vi permetterà di utilizzare un oggetto esistente come modello per la creazione di un nuovo oggetto.

No. Il problema è che la parola chiave With (la parola oggetto di inizializzazione, non la dichiarazione) può essere utilizzato solo dopo aver creato un nuovo oggetto.

Il team VB pensa che gli effetti collaterali dell'utilizzo di With su un oggetto esistente sarebbe troppo confuso.

A proposito il problema: se Match non è ancora una proprietà del Product, la soluzione più pulita potrebbe essere per incapsulare l'output richiesto in un nuovo oggetto:

From m as Product in Me _
  Select New With {.Match = m.Name.IndexOf(query), .Product = m} _ 
  Where m.Name.IndexOf(query) > 0

Con un metodo di estensione su System.Object che accetta un lambda, è possibile simulare abbastanza da vicino tale caratteristica. C'è un esempio in questa risposta , ma è in C #. Probabilmente non è troppo difficile da tradurre in VB.NET.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top