查找重复项并快速返回List(类)

时间:2017-10-12 17:01:46

标签: c# performance linq

我有一个包含字符串,整数和双精度的“litem”类。我有一个名为“myList”的List(litem)。我想在myList中找到基于litem.c1的重复项,它是litem的字符串元素。我需要通过将它们链接到具有唯一ID的重复对来修改这些重复元素。问题是我的数据很大而且我的代码很慢。 myList有220万条目。我通过这种方式找到了重复:

var duplicateItems = myList
                .AsParallel()
                .GroupBy(x => x.c1)
                .Where(x => x.Count() > 1)
                .Select(x => x.Key)
                .ToList();

这将在大约3秒内运行并返回大约40.000个字符串,这些字符串是重复项的litem.c1值。然后我跑:

var result = myList
                .AsParallel()
                .Where(item => duplicateItems.Any(d => d.Equals(item.c1)))
                .ToList();

这将返回我需要的80.000 litems的列表,但它运行超过30分钟,同时100%加载i7 CPU。在此之后,我在resut上使用foreach来添加找到的重复文字之间的链接。问题是如何以更便宜的方式获得结果?

2 个答案:

答案 0 :(得分:0)

使用散列集代替列表,并检查散列集是否包含该项。

public AlarmParcel(){}

这应该可以加快速度。

仅供参考,hashset不是线程安全的,因此var duplicateItems = new HashSet<string>(myList .AsParallel() .GroupBy(x => x.c1) .Where(x => x.Count() > 1) .Select(x => x.Key)); var result = myList .AsParallel() .Where(item => duplicateItems.Contains(item.c1)) .ToList(); 可能会导致错误。

但是,我真的不明白为什么你不这样做:

.AsParallel()

答案 1 :(得分:0)

不是获取所有重复的项目,而是将该查询投射到他们的组密钥中,只需要再次查找这些组中的所有项目,您只需使用已经分组记录以获取结果,而不是在第一个查询中将它们放在地板上,从而不需要第二个查询。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;