我有一个叫Customer
有几个字符串属性的类
firstName, lastName, email, etc.
我从一个csv
创建该类数组的文件中读取客户信息:
Customer[] customers
我需要删除具有相同电子邮件地址的重复客户,每个特定电子邮件地址只留下1个客户记录.
我使用2个循环完成了这项工作,但由于通常有50,000多个客户记录,因此需要将近5分钟.完成删除重复项后,我需要将客户信息写入另一个csv文件(此处无需帮助).
如果我Distinct
在循环中执行了一个循环,那么如何删除作为该特定客户的类的一部分的其他字符串变量?
谢谢,安德鲁
使用Linq
,您可以在O(n)时间(单级循环)中使用a执行此操作GroupBy
var uniquePersons = persons.GroupBy(p => p.Email) .Select(grp => grp.First()) .ToArray();
更新
一点点O(n)
行为GroupBy
.
GroupBy
在Linq
(Enumerable.cs
)中实现为 -
该IEnumerable
迭代一次创建分组.提供Hash
的密钥的一个(例如,这里的"电子邮件")用于查找唯一密钥,并且元素被添加Grouping
到与密钥对应的元素中.
请参阅此GetGrouping代码.还有一些旧帖子可供参考.
GroupBy操作的渐近复杂性是什么?
LINQ方法的运行时复杂性(Big-O)有什么保证?
然后Select
显然是一个O(n)代码,O(n)
整体上面的代码.
更新2
处理empty
/ null
值.
所以,如果存在这样的情况,其中的价值Email
是null
或empty
,简单的GroupBy
将刚刚从这些对象之一null
与empty
每个.
使用null
/ empty
value 包含所有这些对象的一种快捷方法是在运行时为这些对象使用一些唯一键,例如
var tempEmailIndex = 0; var uniqueNullAndEmpty = persons .GroupBy(p => string.IsNullOrEmpty(p.Email) ? (++tempEmailIndex).ToString() : p.Email) .Select(grp => grp.First()) .ToArray();