0

重複の可能性:
String.comparison のパフォーマンス (トリムあり)

string.Trim() を呼び出さずに、最初の文字列のプレフィックスとポストフィックスの空白を無視して、2 つの文字列が等しいかどうかを判断する関数を書きたいと思います。鈍感な場合もご検討ください。

仮定する:

string str1 = "   Abc   ";
string str2 = "abc";

bool trueEqual = IsEqualWithoutWhiteSpace(str1, str2, /*ignore case?*/ true);  // return true.
4

4 に答える 4

1

パフォーマンス上の理由からこれを行いたいと思います (これは場合によっては正当な理由になります。通常の時期尚早の最適化警告は省略します)。

まず、先頭と末尾の両方の文字列の空白文字の数を数えます。非空白部分の長さが同じでない場合は、false を返します。これで、長さが同じであることがわかりました。

次に、適切な start および count 引数を指定して呼び出しstringA.IndexOf(stringB, ...)、一致が見つかったかどうかを判断します。一致があった場合、文字列は実装に従って等しいです。

大文字と小文字を区別する必要がない場合は、ループを使用して両方の文字列の中間部分を比較することもできます。

于 2012-07-19T14:33:10.523 に答える
0

缶をもう一度キックするには、トリムがあなたの友達です。ただし、トリムの使用を避ける別の方法は次のようになります。

bool found = string1.Contains(string2);

string1 が空白を含む可能性があり、大文字と小文字を区別したい場合。大文字と小文字を区別したくない場合は、各文字列の後に .ToLower をスローします。

bool found = string1.ToLower().Contains(string2.ToLower());

最後に、どちらに空白があるかわからないが、そのうちの 1 つだけが空白になる場合 (たとえば、2 つの入力のうちの 1 つは合理的に信頼できるソース (コード内の文字列など) から取得され、もう 1 つはユーザーが追加したものから取得されますが、コードのユーザーが入力を入れるためにどの順序を選択したかわからない場合) or 演算子を使用できます。

bool found = string1.Contains(string2) || string2.Contains(string1);

ただし、これらは一種の特殊なケースであり、.Net チームはコードを効率的にするためにかなり良い仕事をしているため、trim を呼び出して 1 回比較する方が、2 回比較して Trim 呼び出しを回避するよりも効率的です (比較では少なくとも Len2 を調べる必要があります)。 - Len1 の数の組み合わせで、空白以外の文字が見つかるとトリムが終了する可能性があるため、関数呼び出しで解決する論理的に単純な問題です。

于 2012-07-19T15:45:39.337 に答える
0

ほら、いやTrim()

        string str1 = "      AbC   ";
        string str2 = "abc";

        var r = new Regex("^[ \t]+|[ \t]+$");
        var trimStr1 = r.Replace(str1, "");
        var trimStr2 = r.Replace(str2, "");

        return trimStr1.Equals(str2, StringComparison.OrdinalIgnoreCase);

他のみんなが言っているように、私はTrim()自分のプロジェクトの 1 つでこれを確実に使用します。

于 2012-07-19T14:37:48.270 に答える
0

コメントが示すように、トリムを使用しない直接的な理由はありません。したがって、Trim で問題ないと確信している場合は、次の方法で解決できます。

public static bool IsEqualWithoutWhiteSpace(this string aLhs, string aRhs)
{
    var left = aLhs.Trim();
    var right = aRhs.Trim();
    return left.Equals(right, StringComparison.OrdinalIgnoreCase);
}

string str1 = "   Abc   ";
string str2 = "abc";

var b = str1.IsEqualWithoutWhiteSpace(str2);

パフォーマンス上の理由である場合は、「私のコードが機能しない理由を説明してもらえますか」ではなく、「誰かが関数を書いてくれませんか」と尋ねているため、質問を再検討してください。

于 2012-07-19T14:32:51.397 に答える