0

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

someList.Distinct(new DistinctComparer());

我认为这行得通,但我错了。比较器对象在 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;
     }

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

4

1 回答 1

3

因此,对于在 11 个属性中有重复的对象,我想保留最近日期的对象,其属性不包含在 Equals 方法中。

在实践中,Distinct将保留(或者更确切地说,屈服)任何相等值中的第一个。所以你可以先按日期倒序排列:

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

不能保证这种行为,但看到它发生变化我会感到震惊——这是最简单、最明显的方法。(有关更多详细信息,请参阅我的 Edulinq 帖子。)您是否愿意依赖这种未记录的行为取决于您 - LINQ to Objects 中有很多没有记录的内容,但我会很漂亮有信心依靠。

于 2013-07-14T19:11:08.037 回答