più veloce come nel minor numero di linee-di-code:
var s = "nbHHkRvrXbvkn";
var duplicates = s.Where(ch => s.Count(c => c == ch) > 1);
var result = new string(s.Except(duplicates).ToArray()); // = "RrX"
più veloce come in più rapida delle prestazioni sarebbe probabilmente qualcosa di simile (non conserva l'ordine):
var h1 = new HashSet<char>();
var h2 = new HashSet<char>();
foreach (var ch in "nbHHkRvrXbvkn")
{
if (!h1.Add(ch))
{
h2.Add(ch);
}
}
h1.ExceptWith(h2); // remove duplicates
var chars = new char[h1.Count];
h1.CopyTo(chars);
var result = new string(chars); // = "RrX"
Performance test
In caso di dubbio - provarlo :)
Yuriy Faktorovich's answer 00:00:00.2360900
Luke's answer 00:00:00.2225683
My 'few lines' answer 00:00:00.5318395
My 'fast' answer 00:00:00.1842144
Molto bello. Ottimo anche il confronto delle prestazioni. La variazione delle prestazioni è probabilmente ancora più visibile con stringhe molto grandi. – Alex
Ho ripetuto il test delle prestazioni in Release build con il debugger staccato (ma la stessa stringa di input). Sono sorpreso dall'esecuzione della risposta di Yuriy; è abbastanza veloce! – dtb
@dtb: La cosa che rallenta la mia risposta rispetto alla tua è che sto mantenendo l'ordine originale nella stringa di output, che richiede un ciclo aggiuntivo attraverso la stringa di input. La tecnica che io e te usiamo per trovare effettivamente i duplicati è * esattamente * la stessa. – LukeH