2

この例では、組み込みのString.Compareメソッドを使用するために、配列を文字列に変換する必要があります。

char[] array = {'a','b','c'};
string s = "abc";

// here is the extra string allocation
var arrayString = new String(array);

var compareResult = String.Compare(s, arrayString);

追加の文字列割り当てなしで文字列をchar配列と比較する簡単な方法はありますか?

注:ここでは、「[a]2つの比較対象間の字句関係を示す32ビットの符号付き整数」が必要な比較セマンティクスが必要です。

ゼロ未満->strAはstrB未満です。

ゼロ->strAはstrBに等しい。

ゼロより大きい->strAはstrBより大きい。

(私はループでこの比較を行っており、追加の文字列割り当て(入力のサイズに基づいて25〜100MB)を使用して大量の追加のガベージを生成しています_。

おそらく、手を汚して自分でコードを書くことになると思います。

4

4 に答える 4

6

これを試して

int len = Math.Min(array.Length, s.Length);
for (int i = 0; i < len; i++) {
    if (s[i] < array[i]) return -1;
    if (s[i] > array[i]) return +1;
}
return s.Length.Compare(array.Length);
于 2013-03-13T19:33:19.960 に答える
3

文字列はを実装IEnumerable<Char>するので、それらをループできます。

for(int i = 0; i < s.Length; i++)
{
   // Do comparisons of  s.Chars[i] with array[i] as wanted
}

上記は、余分な文字列の割り当てを回避します(そして、文字列の長さが文字配列の長さと同じかそれよりも大きいと想定します)。

于 2013-03-13T19:30:23.150 に答える
1

SequentialEqualを使用するのはどうですか?

char[] array = {'a', 'b', 'c'};
string s = "abc";
bool result = array.SequentialEqual(s);

結果は、等しい場合はtrue、異なる場合はfalseになります。

配列と文字列を比較せず、等しいかどうかをチェックするだけです。他の人はこの質問に対してより良い答えをしました。

さて、@FlyingStreudelと@OlivierJacot-Descombesのソリューションに基づいた私のソリューションがここにあります:

private void button1_Click(object sender, EventArgs e)
{
    char[] array = { 'a', 'b', 'c' };
    string s = "abc";
    s.Compare(array);
}

..。

public static class StringUtils
{
    public static int Compare(this String str, char[] chars)
    {
        if (str == null && chars == null) return 0;
        if (str == null) return -1;
        if (chars == null) return 1;
        int max = Math.Min(str.Length, chars.Length);
        for (int i = 0; i < max; i++)
            if (str[i] < chars[i])
                return -1;
            else if (str[i] > chars[i])
                return 1;
        return str.Length.CompareTo(chars.Length);
    }
}

主な違いは、iをchars.Lengthと比較しないことです。

これがあなたの探求に役立つことを願っています。

于 2013-03-13T19:32:02.373 に答える
1

拡張メソッドを書くことができます:

public static int Compare(this String str, char[] chars)
{
    for (int i = 0; i < str.Length; i++)
        if (i == chars.Length)
            return 1;
        else if (str[i] < chars[i])
            return -1;
        else if (str[i] > chars[i])
            return 1;
    if (chars.Length > str.Length)
        return -1;           
    return 0;
}
于 2013-03-13T19:33:28.040 に答える