L'interrogazione delle coppie di valori chiave è efficiente rispetto agli oggetti a due proprietà?

7

Sto lavorando su un servizio web e sto restituendo JSON. Tuttavia, sto restituendo un List<KeyValuePair<string, int>> , poiché è tutto ciò che ho intenzione di trattare (proprietà = > valore)

Ora a volte io stesso chiamerò queste funzioni per aggregare i risultati, quindi finisco con qualcosa come

List<KeyValuePair<string, int>> myList = resultList.where(o => o.Key =="StringKEY");

e qualche volta

List<KeyValuePair<string, int>> myList = resultList.sum(o => o.Key =="StringKEY");

La mia domanda è, sarebbe più efficiente fare quanto segue (classe vs dizionario personalizzato):

List<MyObject> myObj = resultObjList.where(o => o.Property1 == "stringProperty")

e così via.

C'è qualche vantaggio nell'usare oggetti personalizzati? Non avrò mai bisogno di aggiungere proprietà, e in questo caso posso dire che non ci sarà mai bisogno di ulteriori proprietà.

    
posta hanzolo 24.01.2012 - 19:28
fonte

3 risposte

7

Stai chiedendo qual è la differenza tra un KeyValuePair e un oggetto a due proprietà? Non c'è nessuno, KeyValuePair è un oggetto a due proprietà. In realtà, potrebbe esserci una differenza: KeyValuePair è un tipo di valore e il tuo oggetto personalizzato sarà probabilmente un tipo di riferimento. La differenza tra un tipo di riferimento e un tipo di valore può avere un impatto sulle prestazioni (specialmente in alcuni ambienti specifici, come XNA su XBox). Ma se questa differenza è importante per te, puoi sempre rendere il tuo tipo personalizzato in un tipo di valore.

Quindi, il mio consiglio è di usare KeyValuePair per cose che in realtà sono una chiave e un valore. Se la relazione tra i due valori è diversa, devi creare il tuo tipo personalizzato, per motivi di leggibilità.

Un'altra opzione in C # 7.0 e più recente è usare le tuple. Sono tipi di valore, proprio come KeyValuePar , ma utilizzarli non implica che tu abbia una chiave e un valore.

    
risposta data 24.01.2012 - 20:50
fonte
3

Creare profili ogni volta che si è in dubbio è sicuramente un buon modo per andare. Dal momento che non riesco a profilare il tuo codice (né vorrei probabilmente farlo), condividerò i miei due centesimi di teoria:

Sia l'oggetto two-property che il tuo KeyValuePair memorizzano essenzialmente gli stessi dati e in entrambi i casi stai memorizzando i tuoi dati in una collection List, il che significa che per trovare le singole voci devi eseguire una scansione completa, O (n) operazione.

In teoria, KeyValuePair < > potrebbe essere più veloce (non sono sicuro se anche il profiler lo noterebbe) perché c'è un livello di riferimento indiretto in meno che deve avvenire.

  • ListEntry (KeyValuePair) - > stringa; ListEntry (KeyValuePair)
  • ListEntry (obj ref) - > Oggetto - > stringa; ListEntry (obj ref) - > Object (int)

Tuttavia, una modifica che potresti fare per migliorare le prestazioni se la tua raccolta diventa piuttosto grande, usa un tipo diverso invece di una lista. Con List sei bloccato con ricerche lineari e non riesci davvero a farne a meno (a meno che tu non spenda altro sforzo manualmente per ordinarlo, ma perché lo faresti).

Dato che hai la nozione che ogni oggetto ha una chiave, usa Dizionario < > o SortedDictionary < > che sarebbe la chiave della tua chiave.

In questo caso, solo per fare un confronto, se il tuo elenco ha 1000 voci e devi trovarne uno, il caso peggiore ti richiederà di fare 1000 confronti. Se si utilizza una raccolta con chiave, nel peggiore dei casi, si eseguiranno solo 10 confronti. Quando si esegue una somma o si cercano più elementi con la stessa chiave, si troveranno tutti insieme nella raccolta, quindi diventa anche molto più semplice (computazionalmente) eseguire quell'operazione, piuttosto che cercarli ovunque.

    
risposta data 25.01.2012 - 04:25
fonte
0

Penso che difficilmente riuscirai a trovare una differenza di prestazioni nel mondo reale dato che si tratta di un servizio web: la richiesta HTTP più veloce sarà comunque di ordini di grandezza più lenta di qualsiasi micro ottimizzazione che puoi ottenere qui.

Per quanto riguarda il codice, a meno che non si tratti effettivamente di un elenco arbitrario di chiavi, utilizzerei un buon vecchio POCO. Intellisense e il controllo del tipo di compilazione sono interessanti.

    
risposta data 25.01.2012 - 15:50
fonte

Leggi altre domande sui tag