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.