我有一个包含字符串,整数和双精度的“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来添加找到的重复文字之间的链接。问题是如何以更便宜的方式获得结果?
答案 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 ) ;