すべてのタブとスペースがスキップされたら、もう何もチェックする必要はありません。
最初の部分だけをスキップしたコードはどこにでもありますが、タブはどこにでもあります。あなたがそれを望んでいるのか、あなたがここに記述しているのかは明らかではありません。私はあなたが持っているコードがその結果に関して正しいと仮定しよう。
これは、ループの一部については何か他のものに対しては何かしたいという共通のパターンです。これは、簡単にそうforeach
から糖衣構文を削除することによって行われています:
foreach (char c in text)
{
if (c == ' ' && tempText == "")
{
//nothing has to be done
}
else if (c != '\t')
{
tempText += c;
}
}
は次のようになります。
using(var en = text.GetEnumerator())
{
while (en.MoveNext())
{
char c = en.Current;
if (c == ' ' && tempText == "")
{
//nothing has to be done
}
else if (c != '\t')
{
tempText += c;
}
}
}
今、私たちはforeach
を解体したことを、我々は簡単に十分な、さらにそれを変更することができます。
using(var en = text.GetEnumerator())
{
while (en.MoveNext())
{
char c = en.Current;
if (c != ' ')
{
do
{
if (c != '\t')
{
tempText += c;
}
} while (en.MoveNext());
return tempText;
}
}
return ""; // only hit if text was all-spaces
}
は、今、私たちは唯一のc
は、それが非スペースを見つけ、列挙の残りのループの異なる並べ替えを行う最初の時間までのスペースであるかどうかを確認するためにチェックをやっています。 (開始時にのみタブをスキップするつもりなら、内側のループから取り出して、最初のテストをc != ' ' && c != '\t'
にしてください)。
(これは別の質問ですが、これと似たような変更が孤立していると考えられますが、入力文字列が非常に大きいか、コードが頻繁にヒットしない限り大事なことは、広範な応用の文脈の中でそれ自体は認められないものへのかなりの変化は、その広い文脈における大きな変化ではない)。
これは一般的なケースで、foreach
に適用されます。ここではさらに2つのことができます。
文字列の列挙子がDispose()
に何もしていないことがわかっているので、using
を削除することができます。もしあなたが本当にできることを確認してください。
もう1つは、foreach
からiteratingに変更できます。
for(int i = 0; i < text.Length; ++i)
{
char c = text[i];
if (c != ' ')
{
do
{
c = text[i];
if (c != '\t')
{
tempText += c;
}
} while(++i < text.Length);
return tempText;
}
return "";
}
または::
2の半分を行う両方のパターンです
int i = 0
while(i < text.Length)
{
char c = text[i];
if (c != ' ')
{
break;
}
++i;
}
while(i < text.Length)
{
char c = text[i];
if (c != '\t')
{
tempText += c;
}
++i;
}
私たちが行うことができ、この出発点から
for(int i = 0; i < text.Length; ++i)
{
char c = text[i]; // We could also have done char[c] arr = text.Chars and used that. The compiler does the equivalent.
if (c == ' ' && tempText == "")
{
//nothing has to be done
}
else if (c != '\t')
{
tempText += c;
}
}
:我々はまた、として、あなたのオリジナルのロジックを記述することができることを考えてみましょう-loopsではなく、foreach
ではなくインデックスを使用します。多くの人がこれをより簡単に見つけることができます(特に配列や文字列の場合には、コンパイラはforeach
を配列や文字列型の変数に標準MoveNext()/Current
のコンボではなくインデックスのfor(;;)
にします)あなたはその最適化を失いたくない])一般的ではありませんが(インデックスに登録できないIEnumerable<char>
では動作しません)
すべての作業を完了したことを知ったときに戻ってくるのはなぜですか?確かに、このような文字列を構築すべきではありません( 'StringBuilder'を使用してください)、' TrimStart'があなたの望むことをするかもしれません... –
この状況の提案をありがとう!私はStringBuilderのことと、それをどのように使用できるかを見ていきます。しかし、それは私が持っている質問に答えることはできません:) – Animiles
あなたはボトルネックがどこにあるかを推測したり、何十億もの "常にXを行う"ルールを学習しても、良いパフォーマンスを達成することはできません。パフォーマンス*目標*を設定します。あなたは明確で分かりやすいコードを書く。パフォーマンスを測定し、目標を達成できない場合は、ボトルネックを特定し、その場所で代替案を評価し始めます。 –