从对象数组中删除重复项我有一个名为Customer的类,它有几个字符串属性firstName,lastName,email等。我从一个csv文件中获取数据文件创建了一个此类的数组:Customer[]customers我需要删除具有相同电子邮件地址的重复客户,只为每个特定的电子邮件地址留下1条客户记录。我使用2个循环完成此操作,但由于通常有50,000多个客户记录,因此需要将近5分钟。完成删除重复项后,我需要将客户信息写入另一个csv文件(此处无帮助)。如果我在循环中执行Distinct,我如何删除属于该特定客户类的其他字符串变量?感谢Andrew使用Linq,您可以使用GroupBy在O(n)时间(单级循环)中执行此操作varuniquePersons=persons.GroupBy(p=>p.Email).Select(grp=>grp.First()).ToArray();关于GroupByO(n)行为的更新。GroupBy在Linq(Enumerable.cs)中实现,因为-IEnumerable仅迭代一次以创建分组。提供的键(例如这里的“email”)的哈希用于查找唯一键,并将该元素添加到与该键对应的分组中。请参阅此GetGrouping代码。还有一些旧帖子可供参考。那么Select显然是一个O(n)的代码,整体上面的代码是O(n)。更新2以处理空值/空值。因此,如果存在Email值为null或空的实例,一个简单的GroupBy将只从null中取出一个对象并将每个对象清空。包含所有具有null/空值的对象的快速方法是在运行时为这些对象使用一些唯一的键,例如vartempEmailIndex=0;varuniqueNullAndEmpty=persons.GroupBy(p=>string.IsNullOrEmpty(p.Email)?(++tempEmailIndex).ToString():p.Email).Select(grp=>grp.First()).ToArray();我这样做:publicclassPerson{publicPerson(stringeMail,stringName){this.eMail=eMail;this.Name=名字;}publicstringeMail{get;放;}公共字符串名称{得到;放;}}公共类eMailKeyedCollection:System.Collections.ObjectModel.KeyedCollection{protectedoverridestringGetKeyForItem(Personitem){returnitem.eMail;}}publicvoidtestIt(){vartestArr=newPerson[5];testArr[0]=newPerson("Jon@Mullen.com","JonMullen");testArr[1]=newPerson("Jane@Cullen.com","JaneCullen");testArr[2]=newPerson("Jon@Cullen.com","JonCullen");testArr[3]=newPerson("John@Mullen.com","JohnMullen");testArr[4]=newPerson("Jon@Mullen.com","测试其他");//与索引0相同的电子邮件...vartargetList=neweMailKeyedCollection();foreach(varpintestArr){if(!targetList.Contains(p.eMail))targetList.Add(p);如果在集合中找到该项目,您可以轻松地选择(并最终修改)它:以上就是C#学习教程的全部内容:从对象数组中删除重复项。targetList.Contains(p.eMail))targetList.Add(p);else{varcurrentPerson=targetList[p.eMail];//修改Name,Addresswhatever...}侵权请点右联系管理员删除如转载请注明出处:
