如何实现筛选包含指定数字的数组元素的FilterByDigit方法?
实现FilterByDigit方法的相关问题解答
关于能否使用Array.FindAll的问题
当然可以用!Array.FindAll 不属于LINQ范畴(它是System.Array类的原生方法,LINQ主要在System.Linq命名空间下),完全符合你“禁止使用LINQ”的要求。用它实现的话,代码会更简洁,不需要手动做两次遍历统计和复制。
用Array.FindAll改写的示例:
public static int[] FilterByDigit(int[]? source, int digit) { if (source == null) throw new ArgumentNullException(nameof(source)); if (source.Length == 0) throw new ArgumentException("Invalid size"); if (digit < 0 || digit > 9) throw new ArgumentOutOfRangeException(nameof(digit)); return Array.FindAll(source, element => IsContainDigit(element, digit)); }
你的循环实现思路分析
你当前的代码逻辑完全正确:
- 先遍历一次统计符合条件的元素数量,再创建对应大小的数组,第二次遍历填充元素,这个思路没问题,能正确完成需求。
IsContainDigit方法的处理很周全,考虑到了元素和指定数字都是0的特殊情况,以及负数取绝对值的边界场景。
如果想优化,可以用List<int>避免两次遍历,一次遍历就能收集所有符合条件的元素,最后转数组:
public static int[] FilterByDigit(int[]? source, int digit) { if (source == null) throw new ArgumentNullException(nameof(source)); if (source.Length == 0) throw new ArgumentException("Invalid size"); if (digit < 0 || digit > 9) throw new ArgumentOutOfRangeException(nameof(digit)); List<int> result = new List<int>(); foreach (int num in source) { if (IsContainDigit(num, digit)) result.Add(num); } return result.ToArray(); }
这种写法代码更简洁,且仅需一次遍历,效率更高。
内容的提问来源于stack exchange,提问作者antonkokt_deprecated
相关产品推荐
相关产品推荐

