如何在没有内存分配的情况下将字符串与char []进行比较?

时间:2013-03-13 19:26:40

标签: c# .net

在这个例子中,我必须将数组转换为字符串以使用内置的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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

字符串实现IEnumerable<Char>,因此可以遍历它们:

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

以上内容将避免额外的字符串分配(并假设字符串长度与字符数组长度相同或更大)。

答案 2 :(得分: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);
    }
}

主要区别在于我不会将每个字符与chars.Length进行比较。

希望这会帮助你完成任务。

答案 3 :(得分: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;
}