2013-03-11 9 views
7

Ho una lista di parole in una lista. Usando .Contains(), posso determinare se una parola è nella lista. Se una parola che specifichi è presente nell'elenco, come faccio a scrivere la distinzione tra maiuscole e minuscole della parola dall'elenco? Ad esempio, .Contains() è true quando la parola è "fosfato di sodio" ma l'elenco contiene "Sodio fosfato". Come si esegue una ricerca insensibile alle maiuscole e minuscole ("fosfato di sodio"), ma si restituisce dall'elenco la corrispondenza sensibile al maiuscolo/minuscolo ("Fosfato di sodio")?Come si ottiene la corrispondenza senza distinzione tra maiuscole e minuscole nell'elenco <string>?

Preferisco evitare un dizionario in cui la chiave è maiuscola e il valore è corretto, o viceversa.

+0

Note a margine: il titolo indica "case sensitive", ma sembra che tu stia cercando l'opposto. Inoltre, un motivo particolare per * non * utilizzare il dizionario con corrispondenza di chiave senza distinzione tra maiuscole e minuscole? –

+0

@AlexeiLevenkov Bene, l'uso di un dizionario si tradurrebbe in una triplicazione dell'impronta di memoria del programma invece di utilizzare il metodo di ricerca più appropriato (in questo contesto). – Servy

+0

@Servy, argee, ma non usare la ricerca lineare attraverso l'elenco può essere utile - non è completamente chiaro per me dalla domanda se la lista non ordinata è il requisito. –

risposta

15

si desidera qualcosa di simile:

string match = list.FirstOrDefault(element => element.Equals(target, 
            StringComparison.CurrentCultureIgnoreCase)); 

questo lascerà match come riferimento null se nessuna corrispondenza può essere trovato.

(Si potrebbe usare List<T>.Find, ma utilizzando FirstOrDefault rende il codice più generale, come funzionerà - con una direttiva using System.Linq; nella parte superiore del file). Su qualsiasi sequenza di stringhe)

Si noti che Presumo che non ci siano elementi nulli nella lista. Se si desidera gestirlo, è preferibile utilizzare una chiamata al metodo statico: string.Equals(element, target, StringComparison.CurrentCultureIgnoreCase).

Si noti inoltre che presumo che si desideri un confronto sensibile alla cultura. Vedi StringComparison per altre opzioni.

+0

per curiosità, perché non 'StringComparison.OrdinalIgnoreCase'? –

+0

+1 Mentre questa è la risposta corretta alla domanda, si noti che la ricerca lineare attraverso una lista non ordinata non è l'operazione più veloce - la costruzione di una lista di articoli da 100 può in questo modo trasformarsi facilmente in un problema. –

+1

@AlexeiLevenkov Alcune centinaia non sarebbero un problema. Avresti bisogno di centinaia di migliaia per essere davvero un grosso problema. – Servy

0

Considerare se Dictionary con il lavoro di confronto senza distinzione tra maiuscole e minuscole per voi. A meno che non ti interessi per l'ordine delle parole, Dictionary ti offrirà prestazioni di visualizzazione migliori rispetto all'elenco.

Dictionary<string, string> openWith = 
     new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase); 
Problemi correlati