【问题标题】:c# array outputs 0 when it isnt specifiedc#数组未指定时输出0
【发布时间】:2016-01-08 16:18:14
【问题描述】:

我正在尝试输出数组的奇数和偶数,我已经完成了所有工作,但是由于某种原因,当我创建一个 foreach 循环并输出每个奇数/偶数数字时,它以零开头?

设置方式是,用户在每个字母之间输入 10 个带逗号的数字(以字符串开头),然后删除逗号并将数字转换为 int 并将其放入 int 数组中,然后在其他类中使用。我输入1,2,3,4,5,6,7,8,9,1来测试一下。

    Odds(ai.Odds);
    Evens(ai.Evens);



    Console.ReadKey();
}
    public static void Odds(int[] odds)
    {
        Console.WriteLine("\nOdds:");
        foreach (var odd in odds)
        {
            Console.Write(odd + " ");   
        }
    }

public static void Evens(int[] evens)
{
    Console.WriteLine("\nEvens:");
    foreach (var even in evens)
    {
        Console.Write(even + " ");
    }
}

并在单独的班级中发挥作用:

public int[] Odds
        {
            get
            {
                int count = 0;
                int[] odds = new int[NumArray.Length];
                string[] oddNums = {"1", "3", "5", "7", "9"};
                foreach (int num in NumArray)
                {
                    foreach (string oddNum in oddNums)
                    {
                        if (num.ToString().EndsWith(oddNum))
                        {
                            odds[count++] = num;
                        }
                    }
                }
                Array.Sort(odds);
                return RemoveDuplicates(odds);
            }
        }

        public int[] Evens
        {
            get
            {
                int count = 0;
                int[] evens = new int[NumArray.Length];
                string[] evenNum = {"0", "2", "4", "6", "8"};
                foreach (int num in NumArray)
                {
                    foreach (string oddNum in evenNum)
                    {
                        if (num.ToString().EndsWith(oddNum))
                        {
                            evens[count++] = num;
                        }
                    }
                }
                Array.Sort(evens);
                return RemoveDuplicates(evens);
            }
        }

这里是 RemoveDuplicates 方法:

private int[] RemoveDuplicates(int[] numbers)
        {
            if (numbers.Length == 0)
            {
                return numbers;
            }
            int[] uniques = new int[numbers.Length];

            int previousVal = numbers[0];
            uniques[0] = numbers[0];
            int count = 1;
            for (int i = 1; i < numbers.Length; i++)
            {
                if (numbers[i] == previousVal) continue;
                previousVal = numbers[i];
                uniques[count++] = numbers[i];
            }
            Array.Resize(ref uniques, count);
            return uniques;
        }

作为输出我得到(vvv),但我不希望它们的开头都有 0,我根本不想要 0

【问题讨论】:

  • 如果您发布一个简短但完整的示例程序,并对其进行适当的格式化,而不是在方法中途以代码开头的点点滴滴,这将更容易为您提供帮助。
  • 我输入 1,2,3,4,5,6,7,8,9,1 来测试它。,包含输出的内容会很有用来自该输入以及您的预期。
  • 另外,这是一种非常可怕的方法来确定某事是奇数还是偶数。与其依赖字符串中的最后一个数字,更简单的处理方法是将字符串转换为数字,然后执行num%2,如果是偶数则为0,如果为奇数则为1。跨度>
  • @MattBurland:如果是奇数和负数,则为-1...我通常使用num &amp; 1
  • @JonSkeet:公平点,但我通常只测试num%2 == 0,所以如果奇数是1-1 不是问题(如果不是偶数,那就是奇数) .但我确实喜欢&amp; 1 的想法,从现在开始我可能不得不使用它。

标签: c# arrays class


【解决方案1】:

但我不希望它们的开头都有 0,我根本不想要 0

那么你不应该创建一个包含 0 的数组,这就是你正在做的。

在您调用Array.Sort(odds) 之前,您的数组将包含来自NumArray 的所有奇数,然后是一堆0 值(与NumArray 中的偶数一样多),因为当您构造一个数组时,它会自动填充每个元素的元素类型的默认值。如果整个 NumArray 都是奇数,则只有没有 0 值。

您只需要所需的元素,因此最好使用List&lt;int&gt;,并在需要时添加。如果您确实需要,可以在最后调用ToArray() 创建一个数组。

【讨论】:

  • 感谢您的评论。如果没有 Array.Sort(odds),它会将 0 放在最后。我将它放入一个数组中,因为这是我被分配的任务并且它需要一个数组。这个任务除了寻找偶数和赔率之外还有其他的小任务,这些其他的也需要一个数组来工作。
  • @Brendon: 当然可以,所以创建一个 List&lt;int&gt; 只包含您需要的内容,然后调用 ToArray()。或者更改您的其余代码,使其不那么不灵活:)
  • 那么在那个特定的属性上,把 NumArray 放到一个 List 中?然后在最后调用 .ToArray() ?
  • @Brendon:不,不是NumArray,而是oddsevens 也是如此)。基本上,当您建立奇数(或偶数)数列表时。
  • @Brendon:如果由于某种原因你不能使用List(因为我假设这是某种家庭作业),那么你的替代方法是调整odd 和@ 987654334@ 数组您对它们进行排序之前,从而在排序之前删除多余的零。
【解决方案2】:

当您为偶数和赔率数组赋值时,您使用 [count++] 作为索引。这意味着它永远不会分配索引 0,并且从数组初始化时开始,它的默认值就是 0。

【讨论】:

  • 不,count++ 将在第一次迭代中产生 0,因为它是 后增量,而不是 前增量。 0 值将位于数组的 end 处。
  • 正如康拉德所指出的,后增量和前增量唯一相关的时间是显示值时;就逻辑而言,它没有区别。
  • 嗯,没有。 count++ 增加变量,但表达式的结果是 original 值。试试吧! int[] x = new int[10]; int count = 0; x[count++] = 5; Console.WriteLine(x[0]); 这将打印 5,因此它正在分配给索引 0。
  • @JohnClifford:后增量与前增量绝对会有所不同。不仅在显示值时。
  • count++是把偶数或奇数放在新数组的那个地方
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2018-03-31
相关资源
最近更新 更多