2011-03-12 8 views
0

テキスト中に2回以上出現するすべての文字を返す関数を書く必要があります。機能なしで使用すると問題はありません(たとえば、ボタンをクリックするなど)。それは私がそれを行う方法は次のとおりです。C#。 charを返すには?

for (int i = 0; i < alph.Length; i++) // alph is my text(string) 
     { 
      int count = allText.Split(alphCh[i]).Length - 1; 
      if (count >= 2)     
       listView2.Items.Add(alphCh[i].ToString());     
     } 

私は関数を書く方法ですそれ:

public char[] chars2(string text) 
    { 
     char[] allChar = text.ToCharArray(); 
     string allText = text.ToString(); 
     string allTextL = text.ToLower(); 
     string alph = "abcdefghijklmnopqrstuvwxyz"; 
     char[] alphCh = alph.ToCharArray(); 
     char[] result = new char[0]; 
     int allcount = 0; 

     for (int i = 0; i < alph.Length; i++) 
     { 
      int count = allText.Split(alphCh[i]).Length - 1; 
      if (count >= 2) 
      { 
       allcount++; 
       result = new char[allcount]; 
       for (int j = 0; j < allcount; j++) 
       { 
        result[j] = alphCh[i]; 
        return result; 
       } 
      }    
     } 
     return result;    
    } 

しかし、関数は、テキストに2回以上発生しただけで最初の文字を返します。たとえば、abcbca-funcはaを返し、funcはa、b、cを返してListViewに書き込むとします。何が間違っていますか?私はあなたの助けが必要です。 〜

+1

リターンは、ループを停止します。 –

+0

いいえ、テキストのどこにでも2回以上出現する可能性があります:abcdabcd、a、b、c、dも返します。 – Daria

+0

ヨカイ・ティマー、やっぱり、どうしたらいいですか?私は続けて書くようにしましたが、それは有用ではありません。 – Daria

答えて

4

あなたがC#3.0以降をお持ちの場合は、LINQを使用することができます。

char[] result = text 
    .GroupBy(x => x) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key) 
    .ToArray(); 
+0

Thanxたくさんたくさん!できます!しかし、1つの質問:私はちょうどラテン文字(英字の文字だけ)を検索することはできますか? 〜 – Daria

1

代わりにリストを返し、listviewと同様に関数内で使用します。そのはすでに

を追加していない場合だけList<char> rVal = new List<char>();、その後rVal.Add(character)を使用することも、ループ内のリターンを削除します。それが最初の結果を発見したとき

+0

気高く、私は削除しました。私はこの考えを持っていましたが、それを行うための簡単な方法がありますか? – Daria

0

は最初return result;が直接返されます。

+0

Thanx、それはどういう意味ですか? – Daria

2

Linqを簡略化できます。これは要件を満たしていますか?

"aabbccpoiu".ToCharArray() 
    .GroupBy(c => c) 
    .Where(g => g.Count() > 1) 
    .Select(g => g.Key) 

a、b、cを返します。

+1

実際にはToCharArrayを呼び出す必要はありません。クラス 'string'はGroupBy拡張メソッドを持たないことをIntellisenseが示しているにもかかわらず、' IEnumerable 'を実装しています。 –

+0

ありがとう、それは私のためのニュースでした。コードの残りの部分がどのように同じであったか楽しみなさい。 – Grastveit

+0

Thanx、Grastveit。 – Daria

1

ループ内だけの提案=

public List<char> getMoreThanTwice(string text) { 

char[] characters = text.toCharArray(); 
Dictionary<char, int> chars = new Dictionary<char, int>(); 
List<char> morethantwice = new List<char>(); 

for (int i=0;i<characters.Length;i++) { 
    if (chars.containsKey(characters[i])) { 
    chars[characters[i]] = chars[characters[i]] + 1; 
    }else{ 
    chars.Add(characters[i], 1); 
    } 
} 

foreach (KeyValuePair keypair in chars) { 
    if (keypair.Value >= 2) { 
    morethantwice.Add(keypair.Key); 
    } 
} 

return morethantwice; 
} 
+0

thanxこれをマークします。 – Daria