" myList.Count"小于列表中

时间:2015-06-18 22:06:55

标签: c# list count

我有一个任务是编写一个程序,它接受一些数字并输入step
然后它必须对这些数字进行二进制表示,并在位置1处销毁位,1*step2*step3*step ...
这是代码:

using System;
using System.Collections.Generic;

class BitKiller
{
    static void Main()
    {
        int
            amountNumbers = int.Parse(Console.ReadLine()),
            step = int.Parse(Console.ReadLine()),
            counter = 0,
            number = 0
        ;
        int[] 
            numBin= new int[8],
            numbers = new int[amountNumbers]
        ;
        var sequence = new List<int>();
        for(int i = 0; i < amountNumbers; i++)
        {
            numbers[i] = int.Parse(Console.ReadLine());
            numBin = ToBin(numbers[i]);
            sequence.InsertRange(counter * 8, numBin);
            foreach(int b in sequence)
            {
                Console.Write(b);
            }
            Console.WriteLine("");
            counter++;
        }
        if(step == 1)
        {
            Console.WriteLine(0);
            return;
        }
        for(int i = sequence.Count; i >= 0; i--)
        {   
            if(i % step == 1)
            {
                sequence.RemoveAt(i);
            }
        }
        Console.WriteLine("List count = {0}", sequence.Count);
        if(sequence.Count % 8 != 0)
        {
            int padding = 8 - (sequence.Count % 8);
            for(int i = 0; i < padding; i++)
            {
                sequence.Add(0);
            }
        }
        foreach(int b in sequence)
        {
            Console.Write(b);
        }
        Console.WriteLine("");
        for(int i = 7, power = 0, y = 0; y < sequence.Count; i--, y++, power++)
        {
            number = number + (sequence[i]) * ToPower(2, power); 
            if(i == 0)
            {
                Console.WriteLine("Result = {0}", number);
                sequence.RemoveRange(0, 8);
                foreach(int b in sequence)
                {
                    Console.Write(b);
                }
                Console.WriteLine("");
                number = 0;
                i = 7;
                y = 0;
                power = 0;
            }
        }
    }

    static int[] ToBin(int number)
    {
        var binSequence = new int[8];
        for(int i = 7; i >= 0; number /= 2, i--)
        {
            if(number % 2 == 0 || (number == 0 && i >= 0))
            {
                binSequence[i] = 0;
            }
            else
            {
                binSequence[i] = 1;
            }
        }
        return binSequence;
    }

    static int ToPower(int number, int power)
    {
        int numberReturn = number;
        if(power == 0)
        {
            return 1;
        }
        if(number == 1)
        {
            return number;
        }
        for(int i = 0; i < power - 1; i++)
        {
            numberReturn = numberReturn * number;
        }
        return numberReturn;
    }
}

现在,还有一些额外的打印行,因此您可以在输入数字时看到二进制数字。
简而言之,我的程序会将数字转换为仅包含&#39; 1&#39;和&#39; 0&#39;然后根据我的公式从这个列表中删除值。
我的主要问题是为什么:

sequence.Count

返回22,当列表中显然有24个.1。使用以下输入进行测试:3,19,255,255,255
结果将是: 255, 254, 252,而正确的输出为255, 255, 252

正是这样,因为这段代码:

if(sequence.Count % 8 != 0)
{
    int padding = 8 - (sequence.Count % 8);
    for(int i = 0; i < padding; i++)
    {
        sequence.Add(0);
    }
}

因为sequence.Count是22(为什么?)条件为真,并且以下for循环用2个零替换我的最后两个&#39; 1。输出错误。
所以回到原点。
当列表中有24个1时,为什么sequence.Count等于22。

很抱歉,如果它有点长且令人困惑,但我发布了整个代码,因为我不知道什么以及如何干扰导致此问题。

2 个答案:

答案 0 :(得分:3)

您要从此代码中的列表中删除两个项目:

for(int i = sequence.Count; i >= 0; i--)
{   
    if(i % step == 1)
    {
        sequence.RemoveAt(i);
    }
}

根据您提供的示例输入,当i == 20且i == 1时,正在调用sequence.RemoveAt。有24个项目,然后您删除了其中的2个。

答案 1 :(得分:0)

正好注意:编程的一整天会影响我的基本微积分。列表计数以及条件是否都正常运行。经过一个小时的测试后,我意识到问题在于我需要将'y'和'i'都设置为-1值,因为当它们达到for循环时它们会立即递增1。感谢您的提示。