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