Najszybciej jak w najmniejszej linii-of-kodu:
var s = "nbHHkRvrXbvkn";
var duplicates = s.Where(ch => s.Count(c => c == ch) > 1);
var result = new string(s.Except(duplicates).ToArray()); // = "RrX"
Najszybciej jak w najszybszym wydajności prawdopodobnie będzie coś takiego (nie zachowuje zamówienia):
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
W razie wątpliwości - przetestować :)
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
Bardzo ładne. Świetne porównanie wydajności. Różnice w wydajności są prawdopodobnie jeszcze bardziej widoczne przy bardzo dużych ciągach. – Alex
Powtórzyłem test wydajności w wydaniu kompilacji z odłączonym debuggerem (ale ten sam ciąg wejściowy). Jestem zaskoczony wykonaniem odpowiedzi Jurija; to dość szybko! – dtb
@dtb: Rzeczą, która spowalnia moją odpowiedź w porównaniu z twoją jest to, że zachowuję oryginalną kolejność w ciągu wyjściowym, co wymaga dodatkowej pętli przez ciąg wejściowy. Technika, której ty i ja używamy do znalezienia duplikatów jest * dokładnie * taka sama. – LukeH