C# 我的for循环不是';I don’我不想重复多少次

C# 我的for循环不是';I don’我不想重复多少次,c#,for-loop,C#,For Loop,我现在被难住了,我不知道为什么会这样。在这个类中,我有一个函数,它在小数点之前的所有数字上循环,以从末尾剔除额外的零,并对小数点之后的数字进行循环。第二部分(删除小数点前的多余零)工作正常,但第一部分(删除小数点后的多余零)工作不正常 我必须多次调用该函数才能剔除数字右端的所有额外零,我不知道为什么。我怀疑这可能与检查字节是否==0有关,但我还不确定 仅供参考:函数在构造函数的最后调用 public class GiantNumber { //constructor and some o

我现在被难住了,我不知道为什么会这样。在这个类中,我有一个函数,它在小数点之前的所有数字上循环,以从末尾剔除额外的零,并对小数点之后的数字进行循环。第二部分(删除小数点前的多余零)工作正常,但第一部分(删除小数点后的多余零)工作不正常

我必须多次调用该函数才能剔除数字右端的所有额外零,我不知道为什么。我怀疑这可能与检查字节是否==0有关,但我还不确定

仅供参考:函数在构造函数的最后调用

public class GiantNumber
{
    //constructor and some other functions...

    public bool IsNegative { get; }
    public bool HasDecimal { get; }
    public List<byte> NumbersBeforeDecimal;
    public List<byte> NumbersAfterDecimal;

    public void CullZeroes()
    {
        for (int i = 0; i < NumbersBeforeDecimal.Count; i++)
        {
            byte number = NumbersBeforeDecimal[i];

            if (number == 0)
            {
                NumbersBeforeDecimal.RemoveAt(i);
            }
            else
            {
                break;
            }
        }

        for (int i = NumbersAfterDecimal.Count - 1; i >= 0; i--)
        {
            byte number = NumbersAfterDecimal[i];

            if (number == 0)
            {
                NumbersAfterDecimal.RemoveAt(i);
            }
            else
            {
                break;
            }
        }
    }
}
公共级GiantNumber
{
//构造函数和其他一些函数。。。
公共bool为负{get;}
公共bool HasDecimal{get;}
十进制之前的公共列表编号;
公共列表编号以十进制为单位;
公共无效消隐零()
{
for(int i=0;i=0;i--)
{
字节数=十进制数之后的数字[i];
如果(数字==0)
{
小数点后的数字。删除(i);
}
其他的
{
打破
}
}
}
}

我在奥萨·珀杰·尔登拉普的帮助下解决了这个问题;因为我正在删除索引并迭代下一个索引,所以每次循环时都会跳过一个索引。如果我将迭代器留空:

for (int i = 0; i < NumbersBeforeDecimal.Count; )
{
    //stuff
}
for(int i=0;i

它不会跳过行!与需要更简单的代码时向后迭代相比,这可能是一个更好的主意(在我的例子中,它要好得多)。

我在Ňssa pøngjǣrdenlarp;因为我正在删除索引并迭代下一个索引,所以每次循环时都会跳过一个索引。如果我将迭代器留空:

for (int i = 0; i < NumbersBeforeDecimal.Count; )
{
    //stuff
}
for(int i=0;i

它不会跳过行!当您想要更简单的代码时,与向后迭代相比,这可能是一个更好的主意(在我的例子中,它要好得多)。

您根本不应该这样做。RemoveAt是O(n),这意味着删除10万个数字大约需要半个小时。这比实际需要多了大约半个小时,因为它可以在几秒钟内完成。您可以在一个步骤中删除整个范围:

int j = 0;
while (j < NumbersBeforeDecimal.Count 
        && NumbersBeforeDecimal[j] == 0)
{
    ++j;
}
NumbersBeforeDecimal.RemoveRange(0, j);
intj=0;
而(j
你根本不应该这样做。RemoveAt是O(n),这意味着删除10万个数字大约需要半个小时。这比实际需要多了大约半个小时,因为它可以在几秒钟内完成。您可以在一个步骤中删除整个范围:

int j = 0;
while (j < NumbersBeforeDecimal.Count 
        && NumbersBeforeDecimal[j] == 0)
{
    ++j;
}
NumbersBeforeDecimal.RemoveRange(0, j);
intj=0;
而(j
问题是
NumbersBeforeDecimal.RemoveAt(i)
删除当前元素,而
i
仍然递增。所以下一次迭代不会检查下一个元素,而是检查它后面的元素。向后循环!(被骗)哦,好吧,这是有道理的!我只想在开始的时候去掉零(在出现有效数字之前),所以你对此有什么建议吗?编辑:如果我只是将迭代器保留在for循环中为空呢?编辑#2:如果我将其留空,它会工作!哑方法类似于
while(NumbersBeforeDecimal.Count>1&&NumbersBeforeDecimal[0]==0)NumbersBeforeDecimal.RemoveAt(0)。更好的方法是找到第一个非零的索引,然后删除从0到该索引的整个范围。最好的方法是根本不要用那种方式存储大数字。我之所以要用这种方式存储大数字,是因为我想有一个与BigInteger等价但带有十进制值的;事实上,我用两个大整数来做运算。我并不太在意这里的性能,因为这只是一个业余项目,我想计算Euler数,使其尽可能精确。问题是
NumbersBeforeDecimal。RemoveAt(I)
删除当前元素,而
I
仍然递增。所以下一次迭代不会检查下一个元素,而是检查它后面的元素。向后循环!(被骗)哦,好吧,这是有道理的!我只想在开始的时候去掉零(在出现有效数字之前),所以你对此有什么建议吗?编辑:如果我只是将迭代器保留在for循环中为空呢?编辑#2:如果我将其留空,它会工作!哑方法类似于
while(NumbersBeforeDecimal.Count>1&&NumbersBeforeDecimal[0]==0)NumbersBeforeDecimal.RemoveAt(0)。更好的方法是找到第一个非零的索引,然后删除从0到该索引的整个范围。最好的方法是根本不要用那种方式存储大数字。我之所以要用这种方式存储大数字,是因为我想有一个与BigInteger等价但带有十进制值的;事实上,我用两个大整数来做运算。在这里,我并不太关心性能,因为这只是一个业余项目,我想计算欧拉数,使其尽可能精确。这等于
,而(0
是的,是的。这会更简单。我认为这篇文章的准确标题是“我的for循环执行的次数没有我想要的那么多。”计算机会按照你告诉他们的去做。正是你告诉他们的。同样如此。你说什么