2016-04-01 9 views
1

条件が真であれば、2つの文字列の間に文字列を挿入する方法はありますか?文字列配列内の単語が終了し、charで始まりその間に新しい文字列を挿入する(C#)

最初の単語がその1つで終わり、2番目の単語がそのうちの1つで始まっているかどうかを調べたい文字の配列があるとします。例えば、「O」と「H」の要件を満たしています文字があるので、条件に合格する「ホーム行く」については

(=>行く___ホーム)

char[] toCheck = {'h','o','d', 'g'}; 
string sentence = "Go home"; 

List<string> words = sentence.Split(' ').ToList(); 

for (int i = 0; i < words.Count - 1; i++) 
    { 
     if (toCheck.Any(x=> x == words[i][words[i].Length - 1]) && 
      (toCheck.Any(x=> x == words[i + 1][0]))) 
     { 
      words.Insert(i,"_between"); 
     } 
    } 

return words.Aggregate("", (current, word) => current + (word + " ")); 

私の問題は、これが「戻っているということです私はなぜ家に行くのか "の代わりに"家の間に行く "と私は理由を見つけることができません。

ありがとうございました。

+1

あなたは 'のx ==言葉[I] .Last()' 'の代わりのx ==の言葉[i]の[言葉[i]が.LENGTH - 1]行うことができます' IMOは、より読みやすいです。そして、戻ってくる文字列を結合するために 'return string.Join(" "、words);'を使います。 – juharr

+1

'if'条件に' i> 0 && 'を加えてください。これはあなたを解決するはずです。 'if'の最初の条件を確認してください。あるいは、より良いのは、 'for'ループを' for(int i = 1; i Icemanind

+1

問題は、 'words'の長さが値を追加してからも増え続けるということです。その理由のためにループしているコレクションを突然変異させないことが最善です。 – juharr

答えて

1

は、あなたの代わりに、元のコレクションの中に挿入するワードのシーケンスを返すようにこれを行うために使用できる方法です。

private static IEnumerable<string> InsertBetween(
    this IList<string> words, 
    char[] characters, 
    string insertValue) 
{ 
    for (int i = 0; i < words.Count - 1; i++) 
    { 
     yield return words[i]; 
     if (characters.Contains(words[i].Last()) && characters.Contains(words[i + 1][0])) 
      yield return insertValue; 
    } 

    if (words.Count > 0) 
     yield return words[words.Count - 1]; 
} 

次に、この

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 
Console.WriteLine(string.Join(" ", sentence.Split().InsertBetween(toCheck, "_between"))); 

を実行すると、あなたの

ゴー_betweenホーム

を与えるだろう、私はちょうどそれはあなたがオーバーループしているcollecitonを変異避けた方が良いと思いますしかし、あなたが挿入を行うときにインデックスをインクリメントする必要がある場合は、挿入された値を超えて移動し、正しい位置に挿入する必要があります。

for (int i = 0; i < words.Count - 1; i++) 
{ 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     (toCheck.Any(x => x == words[i + 1][0]))) 
    { 
     words.Insert(i + 1, "_between"); 
     i++; 
    } 
} 
+0

ありがとう!最後に、私の場合にはこの方法が最も適しているので、答えとして受け入れています。 – Razzor

1

新しいstringに保存された文持つことによってそれを非常にストレートフォワードな方法をやって考えてみましょう:あなたは、現在のメソッドの言葉を作りたい場合は、あなたが挿入するために参照する必要があり、言われていること

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 

string finalsentence = ""; 

List<string> words = sentence.Split(' ').ToList(); 
for (int i = 0; i < words.Count - 1; i++) { 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     (toCheck.Any(x => x == words[i + 1][0]))) { 
      finalsentence = words[i] + "_between" + words[i + 1] + " "; 
    } 
} 

return finalsentence; 

をインデックスi + kaggregateはなく、むしろi未満、string.Joinを用いて(インクリメントkが、1からjuharrのおかげで始まる):

char[] toCheck = { 'h', 'o', 'd', 'g' }; 
string sentence = "Go home"; 
int k = 1; 

List<string> words = sentenc;e.Split(' ').ToList(); 
for (int i = 0; i < words.Count - 1; i++) { 
    if (toCheck.Any(x => x == words[i][words[i].Length - 1]) && 
     toCheck.Any(x => x == words[i + 1][0])) { 
      words.Insert(i + k++, "_between"); 
    } 
} 

return string.Join(" ", words); 
+1

それ以上は 'StringBuilder'です。 – juharr

+0

@juharrまたは 'string.Join' ...;) – Ian

+1

単語が挿入されると、' i'をインクリメントする必要があります。あるいは、挿入された単語の最後の文字が無限ループになります。 – juharr

0

"私の問題は、" Go _between home "の代わりに" _between Go _between home "を返していて、なぜそれを見つけることができないということです。"

words.Insert(i,"_between");のあなたのiインデックスは0から始まっているので、多くの点でコードを変更することができますが、あなたの質問に基づいてそれを維持したい場合は、i == 0の場合はwords.Insert(i,"_between");にしないでください。このことができます

希望...ここ

関連する問題