当前位置:  开发笔记 > 编程语言 > 正文

从对象数组中删除重复项

如何解决《从对象数组中删除重复项》经验,为你挑选了1个好方法。

我有一个叫Customer有几个字符串属性的类

firstName, lastName, email, etc.  

我从一个csv创建该类数组的文件中读取客户信息:

Customer[] customers  

我需要删除具有相同电子邮件地址的重复客户,每个特定电子邮件地址只留下1个客户记录.

我使用2个循环完成了这项工作,但由于通常有50,000多个客户记录,因此需要将近5分钟.完成删除重复项后,我需要将客户信息写入另一个csv文件(此处无需帮助).

如果我Distinct在循环中执行了一个循环,那么如何删除作为该特定客户的类的一部分的其他字符串变量?

谢谢,安德鲁



1> Arghya C..:

使用Linq,您可以在O(n)时间(单级循环)中使用a执行此操作GroupBy

var uniquePersons = persons.GroupBy(p => p.Email)
                           .Select(grp => grp.First())
                           .ToArray();

更新

一点点O(n)行为GroupBy.

GroupByLinq(Enumerable.cs)中实现为 -

IEnumerable迭代一次创建分组.提供Hash的密钥的一个(例如,这里的"电子邮件")用于查找唯一密钥,并且元素被添加Grouping到与密钥对应的元素中.

请参阅此GetGrouping代码.还有一些旧帖子可供参考.

GroupBy操作的渐近复杂性是什么?

LINQ方法的运行时复杂性(Big-O)有什么保证?

然后Select显然是一个O(n)代码,O(n)整体上面的代码.

更新2

处理empty/ null值.

所以,如果存在这样的情况,其中的价值Emailnullempty,简单的GroupBy将刚刚从这些对象之一nullempty每个.

使用null/ emptyvalue 包含所有这些对象的一种快捷方法是在运行时为这些对象使用一些唯一键,例如

var tempEmailIndex = 0;
var uniqueNullAndEmpty = persons
                         .GroupBy(p => string.IsNullOrEmpty(p.Email) 
                                       ? (++tempEmailIndex).ToString() : p.Email)
                         .Select(grp => grp.First())
                         .ToArray();

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有