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] 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);

如果它们相等,则结果为真,如果它们不同,则结果为假。

我知道它不比较数组和字符串,它只检查它们是否相等。其他人已经对这个问题做出了更好的回答。

好的,这是我基于@FlyingStreudel 和@Olivier Jacot-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 回答