0

“每个人”都知道来自MoreLinq的有用 DistintBy 扩展,我需要使用它通过多个属性(没问题)来区分列表 os 对象,并且当其中一个属性是列表时,这是我的自定义类:

public class WrappedNotification
{
    public int ResponsibleAreaSourceId { get; set; }
    public int ResponsibleAreaDestinationId { get; set; }
    public List<String> EmailAddresses { get; set; }
    public string GroupName { get; set; }
}

在测试文件中创建一些对象并尝试区分这些项目

List<WrappedNotification> notifications = new List<WrappedNotification>();
notifications.Add(new WrappedNotification(1, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));
notifications.Add(new WrappedNotification(0, 1, new List<string>() { "email" }, EvaluationStatus.Approved, "group"));

请注意,只有第一项不同,所以如果我使用以下代码,我可以区分这些项目,结果列表将有 2 个项目,并且没问题。

 notifications = notifications.DistinctBy(m => new
 {
     m.ResponsibleAreaSourceId,
     m.ResponsibleAreaDestinationId,
     //m.EmailAddresses,
     m.EvalStatus
 }).ToList();

如果我评论该行 (//m.EmailAddresses) 它不起作用并返回 5 个项目。我怎样才能做到这一点?

4

1 回答 1

0

DistinctBy对您指定的每个“键”使用默认的相等比较器。默认的相等比较器List<T>仅比较列表本身的引用。它不检查两个列表的内容是否相同。

在你的情况下DistinctBy是错误的选择。您需要使用Enumerable.Distinct并提供IEqualityComparer用于SequenceEquals电子邮件地址的自定义。

于 2013-02-18T13:53:09.327 回答