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、に追加する前に各要素を文字列に内部的に変換する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 に答える