C# .NET 5.0控制台应用如何移除数组多余默认零值且保留输入0
问题根源
- 你使用了和输入数组等长的定长
int数组存储奇偶分类结果,int为值类型,未手动赋值的元素默认值为0,你现在通过跳过0的方式过滤未赋值位置,自然会把用户输入的有效0也过滤掉 - 当前的奇偶判断逻辑将模2等于0的数归为偶数,0模2结果为0,如果你需要将0判定为奇数,首先要调整分类规则
最优修复方案(推荐)
直接使用可变长度的List<int>存储分类结果,不会产生空占位元素,完全不需要额外过滤逻辑:
using System; using System.Collections.Generic; namespace ConsoleApp1 { class Program { static void Main(string[] args) { int[] numbers = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32); List<int> numbers_odd = new List<int>(); List<int> numbers_even = new List<int>(); for (int repeat = 0; repeat < numbers.Length; repeat++) { int current = numbers[repeat]; int uitkomst = current % 2; // 自定义规则:0判定为奇数,其余数字按模2结果判断 if(current == 0 || uitkomst == 1) { numbers_odd.Add(current); } else { numbers_even.Add(current); } } Console.Write("even: "); foreach (int item in numbers_even) { Console.Write(item + " "); } Console.WriteLine(" "); Console.Write("odd: "); foreach (int item in numbers_odd) { Console.Write(item + " "); } } } }
若必须使用定长数组的修复方案
将数组改为可空值类型int?[],未赋值的元素默认值为null,过滤时跳过null即可,不会影响有效0的输出:
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { int[] numbers = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToInt32); int uitkomst = 0; int?[] numbers_odd = new int?[numbers.Length]; int?[] numbers_even = new int?[numbers.Length]; for (int repeat = 0; repeat < numbers.Length; repeat++) { int current = numbers[repeat]; uitkomst = current % 2; if(current == 0 || uitkomst == 1) // 自定义规则:0算奇数 { numbers_odd[repeat] = current; } else { numbers_even[repeat] = current; } } Console.Write("even: "); foreach (int? item in numbers_even) { if(item.HasValue) { Console.Write(item + " "); } } Console.WriteLine(" "); Console.Write("odd: "); foreach (int? item in numbers_odd) { if (item.HasValue) { Console.Write(item + " "); } } } } }
内容的提问来源于stack exchange,提问作者Mical
相关产品推荐
相关产品推荐

