0

当我只使用 1 位字符串时,我的 andgate 工作,但其他任何东西,它根本不起作用,并告诉我“特定参数超出了有效值的范围。参数名称:startIndex。”

有人知道我在这里做错了什么吗?有没有更好的方法添加到字符串的末尾?谢谢!

private string parsestrings(string s1, string s2)
{
    int n = s1.Length;
    int m = s2.Length;
    int l;
    string s = "";
    if (n > m)
    {
        for(int i = 0; i <= n; i++)
        {
            l = AndGate(s1[i], s2[i]);
            s.Insert(i, IntToBinary(l));
        }
    }
    else
    {
        for (int i = 0; i <= n; i++)
        {
            l = AndGate(s1[i], s2[i]);
            s.Insert(i, IntToBinary(l));
        }
    }
    return s;
}

private int AndGate(int m, int n)
{
    if (m == 1 && n == 1)
        return 1;
    if (m == 1 && n == 0)
        return 0;
    if (m == 0 && n == 1)
        return 0;
    else
        return 0;
}
4

3 回答 3

1

您的循环终止条件错误。'i <= n' 在字符串末尾运行字符串索引。

于 2012-04-28T00:39:36.400 回答
1

你的逻辑似乎有点不对劲。如果n > m,那么循环可能应该停止在m而不是n

for(int i = 0; i <= m; i++)
{
    l = AndGate(s1[i], s2[i]);
    s.Insert(i, IntToBinary(l));
}

不过,第二个循环似乎是正确的。

第二个想法是条件i <= m可能应该是i < m,因为s1[m]是字符串后面的一个字符。

最后,您可以听从 spender 的建议,也可以使用 aStringBuilder代替。构造字符串通常比不断添加和更新字符串更好。

于 2012-04-28T00:40:26.377 回答
0

s.Insert创建一个新字符串。它不会修改原始字符串。

你的意思是:

s = s.Insert ....

,同样在你的情况下n > m,你一直迭代到n,即使字符串s2不是n字符长,所以你会越界。

另一方面,LinqZip扩展方法允许您在一行中执行此操作:

string.Concat(
    s1
       .Zip(s2, (c1,c2) => new {c1, c2})
       .Select(x => x.c1 == '1' && x.c2 == '1' ? '1' : '0'))
于 2012-04-28T00:34:59.010 回答