エレガントな弦

.netの文字列を使用して何かを行う必要があると想像してください。 何かはそれほど複雑ではありませんが、非常に単純ではありません。 たとえば、適切な書式設定を行うには、テキスト内のコンマの後にスペースを入れます。 .netはすぐに使用できるものを提供していますか?

このようなもの:



string str = "..."; str.Replace(",", ", ");
      
      







待ってください。しかし、コンマを置き換えるのではなく、スペースを入れたいと思います!..



では、先に進みましょう。

検閲を紹介しましょう。 私たちのテキストでは、たとえば「熊」という言葉を許可しません。 簡単です。 各「クマ」を省略記号に置き換えます。

ええ代わりに したがって、同じReplaceメソッドを使用するのが論理的です。 すぐに言ってやった:



 string str = "         .    ,    ."; var result = str.Replace("", "...");
      
      







うーん、最初のクマの代わりに省略記号が表示されましたが、2番目のクマは誇らしすぎて大文字で始まりました。 そして、彼が保存する前の方法。 もう一度走り、誇りに思うクマを変えなければなりません。



 string str = "         .    ,    ."; var result = str.Replace("", "...").Replace("", "...");
      
      





ふう、わかった。 あまり美しくありませんが、機能します。 しかし、それは機能しますか? 突然、そのような「蜂蜜」が来るのですか?

私たちもそのような不品行を考え、緊張し、断ち切りました。 しかし、どのような価格で!



 string str = "         .    ,    ."; int index = str.IndexOf("", StringComparison.CurrentCultureIgnoreCase); while (index >= 0) { str = str.Remove(index, "".Length); str = str.Insert(index, "..."); index = str.IndexOf("", StringComparison.CurrentCultureIgnoreCase); }
      
      





このコードの何かが間違っています。 そして、2つの問題があります。

  1. イミュニティによるすべてのステップでの行の再作成による実行の遅延
  2. 実用的なコードの低レベルの部分。通常はUtil



    と呼ばれるクラスで参照され、意味論的に検証された魅力的なプロジェクトの中で忘れられます(空想を想像することさえできますか?)


同時に、パフォーマンスを改善するソリューションがありますStringBuilder



を使用して書き換えます。

しかし、静かにうめくような美的感覚をどうするか?



既存の.net文字列インターフェイスが古いことを認める必要があります。 それは古風で十分な柔軟性がなく、一見普通で単純な操作のために何度も何度も奇妙なコードを書くようになります。

まだnull



を確認することを忘れないでください。 インデックスの境界値をチェックします。 そして、行の長さを正しく管理してください。



これが、Fluent文字列インターフェイスインターフェイスのアイデアが生まれた方法です。

モダンで読みやすく、十分にテストされています。



その結果を見てみましょう。



挿入操作の例:

 string t = "      .    !     " .Insert(",    ").After(2, "").IgnoringCase().From(The.Beginning); t.Should().Be("      .    ,    !     ");
      
      





Insert " " after second "" ignoring case from the beginning.



Insert " " after second "" ignoring case from the beginning.



しかし、それは私ですか? 同様に明確です。



何かを削除します:

 string t = "    ->    ->,    ->" .Remove(2, ""); transformed.Should().Be("    ->    ->,    ->");
      
      







次に、大文字と小文字を区別してすべてを削除します。

 string t = "       ".RemoveAll("").IgnoringCase(); t.Should().Be("      ");
      
      







またはこのように:

 string t = "Some very long string".RemoveChars('e', 'L', 'G').IgnoringCase(); t.Should().Be("Som vry on strin");
      
      







など:

 string t = "     , ".RemoveVowels().For("ru"); t.Should().Be("     , ");
      
      







標準ロジックを拡張する場所がありました:

 bool isEmptyOrWhiteSpace = " ".IsEmpty().OrWhiteSpace(); isEmptyOrWhiteSpace.Should().Be(true);
      
      







そこの通路:

 var indexes = "    ,         " .IndexesOf("").IgnoringCase(); indexes.Should().ContainInOrder(21, 44, 64);
      
      







そして戻る:

 var indexes = "    ,         " .IndexesOf("").From(The.End); indexes.Should().ContainInOrder(44, 21);
      
      







そして熊の例はコンパクトで読みやすいです:

 string str = "         .    ,    ."; var result = str.ReplaceAll("").With("...").IgnoringCase();
      
      







プロジェクトは積極的に書かれています。 多くのインターフェイスがすでに開発されており、ほとんどが実装およびテストされています。

しかし、まだ多くの仕事があり、コミュニティの支援は非常に役立ちます。



NuGetですぐに試すことができます。

GitHubまたはCodePlexでプロジェクトを支援します



All Articles