更高效的循环?

时间:2013-03-27 20:08:32

标签: c# arrays string loops operators

所以我正在写一个简单的结构,就像一个字符串数组,但有一些方便的运算符和其他函数,我一直想在字符串中看到。具体来说,我现在正在处理的方法是/运算符。 问题是,它不会像我希望的那样添加到最后的剩余部分。

它应该做的是采用一系列字符串,比如{"Hello", "Test1", "Test2", "Goodbye", "More?", "Qwerty"},并说,我想要除以4,它应该返回{ {"Hello", "Test1", "Test2", "Goodbye"}, {"More?", "Qwerty"} }但它没有“T

整个班级(我想改进的方法是/操作员,但是如果你看到其他任何我可以工作的东西请指出来)(我知道几乎没有任何评论。很抱歉,没有期待别人看到我的代码。):

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;
        }
    }

}

它的作用基本上是你的数组(单个数组)并将它分成一堆大小相同的数组,然后在最后添加新数组中的余数。

1 个答案:

答案 0 :(得分: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函数,所以我们很清楚。当创建所有这些新对象的时间达到CPU时,tempCollection = new StringCollection(tempCollection, x[i]);是f $ * kin'TERRIBLE。

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

编辑:发现一个错误,忘记在添加到ret

时将retLen设置回0