C# 从常规列表中删除重复项
我定义了一个对象,为它创建了一个IEqualityComparer类,并像这样使用它:C# 从常规列表中删除重复项,c#,linq,C#,Linq,我定义了一个对象,为它创建了一个IEqualityComparer类,并像这样使用它: someList.Distinct(new DistinctComparer()); 我认为这很有效,但我错了。比较器对象在Equals方法中指定对象的11个属性。我意识到删除的重复项是随机的 有一个额外的财产,我想删除的基础上,一个日期。因此,对于11个属性中有重复项的对象,我希望保留最近日期的对象,其属性不包括在Equals方法中 如果重要的话,对象是USPS定义的美国地址。Equals方法:
someList.Distinct(new DistinctComparer());
我认为这很有效,但我错了。比较器对象在Equals方法中指定对象的11个属性。我意识到删除的重复项是随机的
有一个额外的财产,我想删除的基础上,一个日期。因此,对于11个属性中有重复项的对象,我希望保留最近日期的对象,其属性不包括在Equals方法中
如果重要的话,对象是USPS定义的美国地址。Equals方法:
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;
}
我不知道如何保留最近销售日期的地址。有什么线索吗?谢谢
因此,对于11个属性中有重复项的对象,我希望保留最近日期的对象,其属性不包括在Equals方法中
实际上,Distinct
将保留(或者更确切地说,产生)任何相等值中的第一个。因此,您可以先按日期反向订购:
var results = someList.OrderByDescending(x => x.Date)
.Distinct(new CustomComparerWhichIgnoresDate());
这种行为无法保证,但看到它的变化我会感到震惊——这是最简单、最明显的方法。(请参阅了解更多详细信息)您是否愿意依赖这种未记录的行为取决于您-LINQ中有很多对象没有记录,但我很有信心依赖它们
因此,对于11个属性中有重复项的对象,我希望保留最近日期的对象,其属性不包括在Equals方法中
实际上,Distinct
将保留(或者更确切地说,产生)任何相等值中的第一个。因此,您可以先按日期反向订购:
var results = someList.OrderByDescending(x => x.Date)
.Distinct(new CustomComparerWhichIgnoresDate());
这种行为无法保证,但看到它的变化我会感到震惊——这是最简单、最明显的方法。(有关更多详细信息,请参阅。)您是否愿意依赖这种未记录的行为取决于您-LINQ中有很多未记录的对象,但我很有信心依赖它们。很好,但这是根据规范,还是这只是一个独特的实现细节(可能在理论上发生变化,或可能在单声道等方面有所不同)?是的,很多应用程序都会崩溃,而微软几乎从来没有这样做过。而且,没有理由改变。我也相信这一点。我同意没有理由改变。我只是想知道这是否符合规范。@JakubJanuszkiewicz:正如我在回答中所说,这种行为不一定会发生。@Jon Skeet:我现在可以看到了。我一定有办法当我发表评论时没有注意到。不错,但这是根据规范,还是仅仅是一个独特的实现细节(可能会在理论上发生变化,或者在Mono中可能会有所不同)?是的,很多应用程序都会崩溃,而微软几乎从来没有这样做过。而且,没有理由改变。我也相信这一点。我同意没有理由改变。我只是想知道这是否符合规范。@JakubJanuszkiewicz:正如我在回答中所说,这种行为不一定会发生。@Jon Skeet:我现在可以看到了。我一定有办法当我评论时错过了它。