C#数组去重代码未达预期结果,请求问题排查
问题分析与解决方案
你的代码之所以去重失败,核心问题出在列表初始化的第一步:
List<int> ProductListFinalized = new List<int>(ProductIdList);
这行代码直接把ProductIdList里的所有元素(包括重复项)都复制到了ProductListFinalized中。后面的循环逻辑是检查当前元素是否在ProductListFinalized里,如果不在就添加——但因为初始化时已经把所有元素都放进去了,这个判断永远不会成立,自然不会做任何去重操作,最终的数组当然还带着原列表的重复值。
几种正确的去重实现方式
方法1:使用LINQ的Distinct()(最简洁)
C#提供了现成的去重方法,一行代码就能搞定,效率也高:
ProductIdListForCycleCount = ProductIdList.Distinct().ToArray();
Distinct()会自动遍历列表,返回一个不含重复元素的序列,直接转成数组即可。
方法2:手动实现去重(适合理解底层逻辑)
如果想自己写循环实现,要先初始化一个空列表,再遍历原列表添加不重复的元素:
List<int> ProductListFinalized = new List<int>(); foreach (int productId in ProductIdList) { if (!ProductListFinalized.Contains(productId)) { ProductListFinalized.Add(productId); } } ProductIdListForCycleCount = ProductListFinalized.ToArray();
这样每遍历一个元素,就检查它是否已经在新列表里,不在才添加,最终得到的就是去重后的结果。
方法3:用HashSet优化性能(适合大数据量)
如果你的ProductIdList元素很多,Contains()方法的时间复杂度是O(n),用HashSet的话Contains()是O(1),性能会更好:
HashSet<int> productIdSet = new HashSet<int>(ProductIdList); ProductIdListForCycleCount = productIdSet.ToArray();
HashSet本身就不允许重复元素,初始化时会自动去重,之后转成数组即可。
内容的提问来源于stack exchange,提问作者Sabyasachi Mukherjee
相关产品推荐
相关产品推荐

