3

因此,我正在编写一个简单的结构来充当字符串数组,但具有一些方便的运算符和其他我一直希望在字符串中看到的函数。具体来说,我现在正在使用的方法是 / 运算符。问题是,它不会像我想要的那样在最后添加任何余数。

它应该做的是获取一个字符串数组,例如{"Hello", "Test1", "Test2", "Goodbye", "More?", "Qwerty"},假设我想除以 4,它应该返回{ {"Hello", "Test1", "Test2", "Goodbye"}, {"More?", "Qwerty"} }但它没有返回。

全班(我想改进的方法是 / 运算符,但如果您看到我可以做的其他事情,请指出)(我知道几乎没有任何评论。对不起,没想到还有其他人除了我之外,还可以查看此代码。):

public struct StringCollection
{
    private String[] value;

    public StringCollection(params String[] s)
    {
        this.value = s;
    }

    public StringCollection(StringCollection current, String ad)
    {
        if (current.value == null) {
            current.value = new String[0] { };
        }
        this.value = new String[current.value.Length+1];
            for (int i=0; i<this.value.Length; i++)
            {
                try {
                    this.value[i] = current[i];
                } catch {
                    break;
                }
            }
            this.value[this.value.Length-1] = ad;
    }
    public StringCollection(StringCollection x, params StringCollection[] y)
    {
        this.value = x.value;
        for (int j=0;j<y.Length;j++)
        {
            for (int i=0;i<y[j].value.Length;i++)
            {
                this += y[j][i];
            }
        }
    }

    public static StringCollection[] operator /(StringCollection x, int y)
    {
        StringCollection[] result = null;
        if (((int)x.value.Length/y) == ((double)x.value.Length)/y)
            result = new StringCollection[y];
        else
            result = new StringCollection[y+1];
        for (int j=0;j<y;j++)
        {
            for (int i=0;i<((int)x.value.Length/y);i++)
            {
                result[j] += x.value[i+(int)((x.value.Length/y)*j)];
            }
        }
        if (((int)x.value.Length/y) != ((double)x.value.Length)/y)
        {
                            // This is the part that isn't working.
            for (int i=0;i<(((int)x.value.Length/y)*result[0].value.Length)-x.value.Length;i++) 
            {
                result[result.Length-1] += x.value[i+((result[0].value.Length)*result.Length-2)];
            }
        }
        return result;
    }
    public String this[int index]
    {
        get {
            return this.value[index];
        }
        set {
            this.value[index] = value;
        }
    }

}

它所做的基本上是获取您的数组(单个数组)并将其拆分为一堆大小相同的数组,然后在最后将剩余部分添加到一个新数组中。

4

1 回答 1

1

首先,您的问题根本与循环无关,或者至少循环仅在您的代码中得到解决。你应该有不同的标题。

其次,可以改进您的阵列添加/删除;即每次将 1 添加到数组大小并删除 1 然后每次重新复制整个数组是一个时间接收器。

现在到你的问题上,你的代码基本上应该是这样的:

//Make your return array
int retLen = x.Length / y;      

//Add space for the remainder
if(x.Length % y != 0)
  retLen++;

var ret = new StringCollection[retLen];

//Reusing variables is a good way to save memory, but watch naming conventions as this can be confusing
retLen = 0;

var tempCollection = new StringCollection();

for (int i = 0; i < x.Length; i++)
{
  tempCollection = new StringCollection(tempCollection, x[i]);

  if(i % y == 0 || i == x.Length - 1)
  {
    ret[retLen++] = tempCollection;
    tempCollection = new StringCollection();
    retLen = 0;
  }    
}

return ret;

我真的不喜欢你在这个结构中没有 Add 函数,这样我们就清楚了。tempCollection = new StringCollection(tempCollection, x[i]);当涉及到创建所有这些新对象的 CPU 时间时,这真是太糟糕了。

很确定你需要调整它以确保所有项目都正确输入,但这是第一次尝试,所以......嗯 oO 想,因为没有人真的会回答你我会花时间。

编辑:发现一个错误,添加到 ret 时忘记将 retLen 设置回 0

于 2013-03-27T21:07:17.607 回答