在对象列表中查找对象数据重复项

使用c#3和.Net Framework 3.5,我有一个Person对象

public Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int SSN { get; set; } } 

我有一个列表:

 List persons = GetPersons(); 

如何在SSN在列表中不唯一的人中获取所有Person对象并将其从人员列表中删除,并理想地将它们添加到另一个名为“ List dupes ”的List dupes

原始列表可能如下所示:

 persons = new List(); persons.Add(new Person { Id = 1, FirstName = "Chris", LastName="Columbus", SSN=111223333 }); // Is a dupe persons.Add(new Person { Id = 1, FirstName = "EE", LastName="Cummings", SSN=987654321 }); persons.Add(new Person { Id = 1, FirstName = "John", LastName="Steinbeck", SSN=111223333 }); // Is a dupe persons.Add(new Person { Id = 1, FirstName = "Yogi", LastName="Berra", SSN=123456789 }); 

最终的结果是将Cummings和Berra列入原始人名单中,并将哥伦布和斯坦贝克列入名为dupes的名单中。

非常感谢!

这可以获得重复的SSN:

 var duplicatedSSN = from p in persons group p by p.SSN into g where g.Count() > 1 select g.Key; 

重复列表如下:

 var duplicated = persons.FindAll( p => duplicatedSSN.Contains(p.SSN) ); 

然后迭代重复项并删除它们。

 duplicated.ForEach( dup => persons.Remove(dup) ); 

感谢gcores让我开始走正确的道路。 这是我最终做的事情:

 var duplicatedSSN = from p in persons group p by p.SSN into g where g.Count() > 1 select g.Key; var duplicates = new List(); foreach (var dupeSSN in duplicatedSSN) { foreach (var person in persons.FindAll(p => p.SSN == dupeSSN)) duplicates.Add(person); } duplicates.ForEach(dup => persons.Remove(dup)); 
 List actualPersons = persons.Distinct().ToList(); List duplicatePersons = persons.Except(actualPersons).ToList(); 

好吧,如果你像这样实现IComparable:

 int IComparable.CompareTo(Person person) { return this.SSN.CompareTo(person.SSN); } 

然后像下面的比较将起作用:

 for (Int32 i = 0; i < people.Count; i++) { for (Int32 j = 1; j < items.Count; j++) { if (i != j && items[i] == items[j]) { // duplicate } } } 

遍历列表并保留一个SSN /计数对的哈希表。 然后枚举您的表并删除与SSN计数> 0的SSN匹配的项目。

 Dictionary ssnTable = new Dictionary(); foreach (Person person in persons) { try { int count = ssnTable[person.SSN]; count++; ssnTable[person.SSN] = count; } catch(Exception ex) { ssnTable.Add(person.SSN, 1); } } // traverse ssnTable here and remove items where value of entry (item count) > 1 

人是否必须是List ? 如果是Dictionary怎么办?

 var persons = new Dictionary(); ... // For each person you want to add to the list: var person = new Person { ... }; if (!persons.ContainsKey(person.SSN)) { persons.Add(person.SSN, person); } // If you absolutely, positively got to have a List: using System.Linq; List personsList = persons.Values.ToList(); 

如果您正在使用Person唯一实例(而不是可能碰巧具有相同属性的不同实例),则使用HashSet可能会获得更好的性能。

基于@gcores上面的建议。

如果要将重复的SSN的单个对象添加回人员列表,请添加以下行:

 IEnumerable> query = duplicated.GroupBy(d => d.SSN, d => d); foreach (IGrouping duplicateGroup in query) { persons.Add(duplicateGroup .First()); } 

我的假设是你可能只想删除重复值减去重复项的原始值。