C# 更有效的循环?

C# 更有效的循环?,c#,arrays,string,loops,operators,C#,Arrays,String,Loops,Operators,因此,我正在编写一个简单的结构,其作用类似于字符串数组,但带有一些我一直希望在字符串中看到的方便的运算符和其他函数。具体来说,我现在正在研究的方法是/operator问题是,它不会像我希望的那样在末尾添加任何余数。 它应该做的是取一个字符串数组,比如{“Hello”,“Test1”,“Test2”,“再见”,“More?”,“Qwerty”},如果我想除以4,它应该返回{“Hello”,“Test1”,“Test2”,“再见”},{“More?”,“Qwerty”},但它没有 整个类(我想改进的

因此,我正在编写一个简单的结构,其作用类似于字符串数组,但带有一些我一直希望在字符串中看到的方便的运算符和其他函数。具体来说,我现在正在研究的方法是/operator问题是,它不会像我希望的那样在末尾添加任何余数。

它应该做的是取一个字符串数组,比如
{“Hello”,“Test1”,“Test2”,“再见”,“More?”,“Qwerty”}
,如果我想除以4,它应该返回
{“Hello”,“Test1”,“Test2”,“再见”},{“More?”,“Qwerty”}
,但它没有

整个类(我想改进的方法是/operator,但是如果你看到我可以使用的其他方法,请指出)(我知道几乎没有任何一个方法被注释过。很抱歉,除了我之外,没有其他人会看到这段代码。):

公共结构字符串集合
{
私有字符串[]值;
公共字符串集合(参数字符串[]s)
{
该值=s;
}
公共StringCollection(StringCollection当前、字符串ad)
{
if(current.value==null){
current.value=新字符串[0]{};
}
this.value=新字符串[current.value.Length+1];

对于(inti=0;i首先,您的问题实际上与循环没有任何关系,或者至少循环只在代码中被处理。您应该以不同的标题来命名

其次,可以改进阵列的添加/删除;即,每次向阵列大小添加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;
//创建返回数组
int-retLen=x.长度/y;
//为其余部分添加空间
如果(x.长度%y!=0)
retLen++;
var ret=新的StringCollection[retLen];
//重用变量是一种节省内存的好方法,但请注意命名约定,因为这可能会造成混淆
retLen=0;
var tempCollection=newstringcollection();
对于(int i=0;i
我真的不喜欢在这个结构中没有Add函数,这一点我们已经很清楚了。
tempCollection=newstringcollection(tempCollection,x[I]);
在创建所有这些新对象的CPU时间方面非常糟糕

很确定你需要调整它以确保所有项目都正确输入,但这是第一次尝试,所以…meh o.o认为既然没有人会回答你,我会花时间


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

这不是这个特定问题的位置也许你正在寻求
代码审查
@DJKRAZE这可能在代码审查时也会关闭,因为他问的是一个特定的问题。代码审查通常假定工作代码,并询问如何最好地重构。这段代码不起作用,他想知道如何修复它。也就是说,这个问题也不适用于所问的堆栈溢出。要成为一个有效的SO问题,我们需要具体了解问题是什么以及如何重现它。您的除法逻辑是什么?您如何提出“x将进入y多少次”的问题使用与整数除法中相同的字符串?@Winderps:实际上,在控制流中吞下异常或使用try-catch是一种不好的做法(仅给出一个原因,当捕获异常时,try-catch是一种非常昂贵的操作)所以你应该检查数组的长度并避免它…谢谢你!哇,与你的代码相比,我的看起来像意大利面条。从现在起我将使用它。:D
//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;