在字符串中实现重复字符删除的最快方法(C#)

Ale*_*lex 8 .net c# string

在C#中,检测String中重复字符并删除它们的最快方法是什么(删除包括重复字符的第一个实例)?

示例输入: nbHHkRvrXbvkn

示例输出: RrX

dtb*_*dtb 21

最快的代码行:

var s = "nbHHkRvrXbvkn";
var duplicates = s.Where(ch => s.Count(c => c == ch) > 1);
var result = new string(s.Except(duplicates).ToArray()); // = "RrX"
Run Code Online (Sandbox Code Playgroud)

最快速性能最快可能是这样的(不保留顺序):

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"
Run Code Online (Sandbox Code Playgroud)

性能测试

如有疑问 - 测试:)

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


Yur*_*ich 9

这是一个非常快速的保存顺序.但是我有点担心LINQ如何组和哪里:

string s = "nbHHkRvrXbvkn";
Console.WriteLine( 
    s.ToCharArray()
        .GroupBy(c => c)
        .Where(g => g.Count() == 1)
        .Aggregate(new StringBuilder(), (b, g) => b.Append(g.Key)));
Run Code Online (Sandbox Code Playgroud)

编辑:在某些情况下,这个比Lut更慢,但它仍然比dtb更慢,但它保留了顺序

private static string MyMethod(string s)
{
    StringBuilder sb = new StringBuilder(s.Length);
    foreach (var g in s.ToCharArray().GroupBy(c => c))
        if (g.Count() == 1) sb.Append(g.Key);

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)