从通用列表中删除重复项

时间:2013-07-14 19:08:00

标签: c# linq

我定义了一个对象,为它创建了一个IEqualityComparer类,并使用它:

someList.Distinct(new DistinctComparer());

我认为这样运作正常,但我错了。 comparer对象在Equals方法中指定对象的11个属性。我意识到删除的重复是随机的。

还有一个额外的属性,我希望删除基于日期。因此,对于在11个属性中具有重复项的对象,我希望保留具有最新日期的对象,其属性不包括在Equals方法中。

如果重要,该对象是USPS定义的美国地址。等于方法:

      public bool Equals(Address x, Address y)
     {
        return x.HouseNo == y.HouseNo &&
           x.PreDir == y.PreDir &&
           x.StreetName == y.StreetName &&
           x.StreetSuffix == y.StreetSuffix &&
           x.PostDir == y.PostDir &&
           x.City  == y.City &&
           x.State == y.State &&
           x.Zip5 == y.Zip5 &&
           x.Zip4 == y.Zip4 &&
           x.Sud == y.Sud &&
           x.UnitNum == y.UnitNum;
     }

我不知道如何保留最近销售日期的地址。有线索吗?感谢

1 个答案:

答案 0 :(得分:3)

  

因此,对于在11个属性中具有重复项的对象,我希望保留具有最新日期的对象,其属性不包括在Equals方法中。

在实践中,Distinct将保留(或更确切地说,产生)任何相等值的 first 。所以你可以先反向按日期排序:

var results = someList.OrderByDescending(x => x.Date)
                      .Distinct(new CustomComparerWhichIgnoresDate());

这种行为无法保证,但我会感到震惊的是看到它发生变化 - 这是最简单,最明显的方法。 (有关详细信息,请参阅my Edulinq post on it。)您是否乐于依赖未记录的行为取决于您 - LINQ to Objects中有很多记录,但是我对依赖它非常有信心。