所以我正在写一个简单的结构,就像一个字符串数组,但有一些方便的运算符和其他函数,我一直想在字符串中看到。具体来说,我现在正在处理的方法是/运算符。 问题是,它不会像我希望的那样添加到最后的剩余部分。
它应该做的是采用一系列字符串,比如{"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;
}
}
}
它的作用基本上是你的数组(单个数组)并将它分成一堆大小相同的数组,然后在最后添加新数组中的余数。
答案 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