移除列表中满足索引倍数条件的元素:Linq实现报错求助
错误原因解析
List<T>.RemoveAll()方法的返回值是int类型,代表被成功移除的元素总数,而你的函数声明要求返回List<int>类型,这就导致了类型不匹配的编译错误CS0029。- 另外代码还存在逻辑bug:
xs.IndexOf(s)会返回列表中第一个等于s的元素索引,如果列表存在重复元素,后续相同元素会错误使用第一个元素的索引,导致判断逻辑失效。
正确的Linq实现方式
要保留不符合「元素是其索引的倍数」条件的元素,可以利用Linq带索引参数的Select重载,同时获取元素和对应索引,再通过Where过滤,最后转成List<int>:
public static List<int> MultipleOfIndex(List<int> xs) => xs.Select((num, idx) => new { Num = num, Index = idx }) .Where(item => // 处理索引为0的边界情况:0不能作为除数,这里默认保留索引0的元素,可按需调整 item.Index == 0 || item.Num % item.Index != 0) .Select(item => item.Num) .ToList();
逻辑说明
Select((num, idx) => ...):遍历列表时同时获取元素num和它的索引idx。Where过滤:- 索引为0时直接保留,避免除以0的异常;
- 索引不为0时,仅保留元素不是索引倍数的项。
- 最后通过
Select提取元素值并转成List<int>返回。
如果需要调整索引0的处理逻辑(比如元素为0时判定为满足条件并移除),可以修改Where的判断:
.Where(item => !(item.Index != 0 && item.Num % item.Index == 0))
内容的提问来源于stack exchange,提问作者Alberto Andrenucci
相关产品推荐
相关产品推荐

