列表去重算法异常:无法移除全部重复项,仍保留每个数字最后两个重复项
列表去重算法问题修复
你的代码没法彻底移除重复项,会留下最后两个重复值,问题出在删除元素后的循环逻辑:当调用primeNumbers.RemoveAt(j)删除j位置的元素时,列表中j位置之后的所有元素都会向前移动一位,但你的j仍会执行j = j + 1,这就跳过了原本在j+1位置、现在移到j位置的元素。如果有三个及以上重复项,就会漏掉一次检查,最终保留两个重复值。
修复方案一:调整内层循环的自增逻辑
删除元素后不立即自增j,只有当当前元素不重复时才让j前进,这样就能确保每个位置都被检查到:
for (int i = 0; i < primeNumbers.Count; i++) { for (int j = i + 1; j < primeNumbers.Count;) { if (primeNumbers[i] == primeNumbers[j]) { primeNumbers.RemoveAt(j); } else { j++; // 仅当无删除操作时才自增j } } } // 遍历输出更简洁的写法 foreach (var number in primeNumbers) { Console.WriteLine(number); }
修复方案二:使用LINQ的Distinct()方法(更简洁高效)
C#的LINQ提供了现成的去重方法,直接生成去重后的新列表,避免手动循环出错:
// 生成去重后的新列表 var uniquePrimeNumbers = primeNumbers.Distinct().ToList(); foreach (var number in uniquePrimeNumbers) { Console.WriteLine(number); }
注意:方案一是直接修改原列表,方案二是创建新列表,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Ibrahim Rizwan
相关产品推荐
相关产品推荐

