más rápido que en el menor número de líneas-de-código:
var s = "nbHHkRvrXbvkn";
var duplicates = s.Where(ch => s.Count(c => c == ch) > 1);
var result = new string(s.Except(duplicates).ToArray()); // = "RrX"
más rápido que en el de mayor rendimiento, probablemente sería algo como esto (no conserva el orden):
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"
Prueba de rendimiento
En caso de duda - probarlo :)
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
Muy bonito. Gran comparación de rendimiento también. La variación del rendimiento es probablemente aún más visible con cadenas muy grandes. – Alex
He repetido la prueba de rendimiento en la compilación Release con un depurador separado (pero con la misma cadena de entrada). Estoy sorprendido por el rendimiento de la respuesta de Yuriy; ¡es bastante rápido! – dtb
@dtb: Lo que ralentiza mi respuesta en comparación con la tuya es que estoy conservando el orden original en la cadena de salida, lo que requiere un bucle adicional a través de la cadena de entrada. La técnica que usted y yo usamos para encontrar realmente a los engañados es * exactamente * la misma. – LukeH