1

.NET 3.5 で TrimEnd() を使用すると、一貫性のない結果が得られます。TrimEnd はとても使いやすいように見えますが、ここで間違っていることはありますか、それともバグですか?

成功事例

  var foundvalue = "hosted.local.chatter.com";
  Console.WriteLine(foundvalue.TrimEnd(".chatter.com".ToCharArray()));
  // Result is "hosted.local" which is expected.

失敗事例

 var foundvalue = "hosted.local.chattermailcom";
 Console.WriteLine(foundvalue.TrimEnd(".chattermailcom".ToCharArray()));
 // Result is "hosted" which is incorrect
4

5 に答える 5

11

正確な文字列を削除するのではなく".chattermailcom"、末尾から「.」、「c」、「a」、「t」、「e」、「r」などの各文字を削除しています。文字列の終わり。 ".chattermailcom"たまたますべての文字が にありますlocalが、そうで".chatter.com"はありません (重要な文字はlです)。

最後から文字列全体を削除したい場合は、 を使用EndsWithしてチェックを行い、substringそれが true かどうかを検討してください。

文字列操作を完全に回避し、URI クラスを使用することも検討できます。URL 全体を解析して、さまざまなコンポーネントを返すことができます。

于 2012-10-02T19:11:40.680 に答える
6

ドキュメントに従って、TrimEnd渡した配列にある文字列の末尾からすべての文字を削除します。2 番目のケースでは、「d」は配列の一部ではないため、メソッドはここで停止します。

于 2012-10-02T19:12:15.927 に答える
4

たぶん、そのための独自のメソッドを書くことができます:

public static class Extensions
{
  public static string RemoveEnd(this string strBefore, string substringToRemove)
  {
    if (!strBefore.EndsWith(substringToRemove))
      return strBefore;

    return strBefore.Remove(strBefore.Length - substringToRemove.Length);
  }
}
于 2012-10-02T19:23:45.867 に答える
2

なぜそれはあなたを驚かせるのですか?TrimEnd は、末尾から削除する文字の配列を取ります。すべての「.」、「c」、「h」、「a」、「t」などを削除するように指示します。そして、文字列「.local.」内のすべての文字を削除するように指示する正確な理由は、それらは削除されます。TrimEnd() の機能をもう一度お読みください。

于 2012-10-02T19:11:48.450 に答える
1

TrimEnd は、文字列を取り除くようには設計されていません。"local" という単語には、trimEnd 文字 ("chattermailcom" -> l、o、c、a、および l が含まれます) に含まれるすべての文字が含まれます。期待どおりのトリムエンドの動作が得られています。

String.TrimEnd メソッド (MSDN):

TrimEnd メソッドは、現在の文字列から、trimChars パラメータにあるすべての末尾の文字を削除します。文字列の最後で、trimChars にない最初の文字が検出されると、トリム操作は停止します。たとえば、現在の文字列が「123abc456xyz789」で、trimChars に「1」から「9」までの数字が含まれている場合、TrimEnd メソッドは「123abc456xyz」を返します。

于 2012-10-02T19:21:22.300 に答える