7

我想从字符串中提取唯一字符。例如:-'AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ'将返回'ABCFGDJ'

我已经尝试过下面的代码,但现在我想优化它。如果有人知道,请建议。

static string extract(string original)
 {
        List<char> characters = new List<char>();   
        string unique = string.Empty; 
        foreach (char letter in original.ToCharArray())    
         {  
             if (!characters.Contains(letter))   
             {      
                  characters.Add(letter);   
              }            
          }  
        foreach (char letter in characters)
        {  
              unique += letter;    
         }     
     return unique;
 } 
4

5 回答 5

14

我不知道这是否更快,但肯定更短

string s = "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ";
var newstr = String.Join("", s.Distinct());
于 2012-09-12T12:51:43.093 回答
5

另一种 LINQ 方法,但不使用string.Join

var result = new string(original.Distinct().ToArray());

老实说,我不知道哪种字符串创建方法会更快。这可能取决于string.Join最终是否在附加到 a 之前在内部将每个元素转换为字符串StringBuilder,或者它是否具有对某些众所周知的类型的自定义支持以避免这种情况。

于 2012-09-12T12:53:39.287 回答
2

怎么样

var result = string.Join("", "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ".Distinct());

确保包含System.Linq命名空间。

于 2012-09-12T12:52:31.003 回答
2

试试这个

string str = "AAABBBBBCCCCFFFFGGGGGDDDDJJJJJJ"; 
string answer = new String(str.Distinct().ToArray()); 

我希望这有帮助。

于 2012-09-12T12:53:49.847 回答
2

如果“AAABBBAAA”应该返回“ABA”,那么下面会这样做。虽然不是很快。

List<char> no_repeats = new List<char>();
no_repeats.Add(s[0]);
for (int i = 1; i < s.Length; i++)
{
    if (s[i] != no_repeats.Last()) no_repeats.Add(s[i]);
}
string result = string.Join("", no_repeats);
于 2012-09-12T13:02:25.223 回答