代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

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

  •  8
  • Chris Conway  · 技术社区  · 15 年前

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

    我有一份清单:

    List<Person> persons = GetPersons();
    

    List<Person> dupes

    原始列表可能如下所示:

    persons = new List<Person>();
    persons.Add(new Person { Id = 1, 
                             FirstName = "Chris", 
                             LastName="Columbus", 
                             SSN=111223333 }); // Is a dupe
    persons.Add(new Person { Id = 1, 
                             FirstName = "E.E.", 
                             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 }); 
    

    最终的结果将是卡明斯和贝拉出现在最初的人物名单中,哥伦布和斯坦贝克也将出现在被称为dupes的名单中。

    非常感谢!

    7 回复  |  直到 15 年前
        1
  •  25
  •   Neil Slater    11 年前

    这将获得重复的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) ); 
    
        2
  •  3
  •   Chris Conway    15 年前

    var duplicatedSSN =
        from p in persons
        group p by p.SSN into g
        where g.Count() > 1
        select g.Key;
    
    var duplicates = new List<Person>();
    
    foreach (var dupeSSN in duplicatedSSN)
    {
        foreach (var person in persons.FindAll(p => p.SSN == dupeSSN))
            duplicates.Add(person);
    }
    
    duplicates.ForEach(dup => persons.Remove(dup));
    
        3
  •  1
  •   Graeme Bradbury    15 年前
    List<Person> actualPersons = persons.Distinct().ToList();
    List<Person> duplicatePersons = persons.Except(actualPersons).ToList();
    
        4
  •  1
  •   Peter Ombwa    7 年前

    基于上述@gcores的建议。

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

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

        5
  •  0
  •   Steven Evers    15 年前

    如果您这样实现IComparable:

    int IComparable<Person>.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
            }
        }
    }
    
        6
  •  0
  •   Mike Marshall    15 年前

    Dictionary<string, int> ssnTable = new Dictionary<string, int>();
    
    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
    
        7
  •  0
  •   user212218 user212218    13 年前

    persons 必须是一个 List<Person> ? 如果它是一个 Dictionary<int, Person>

    var persons = new Dictionary<int, Person>();
    
    ...
    
    // 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<Person> personsList = persons.Values.ToList();
    

    如果您使用的是 Person (与可能恰好具有相同属性的不同实例相反),使用 HashSet .