DistinctBy当distinct属性是一个列表

“每个人”都知道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"));

请注意,只有第一个项目是不同的,所以如果我使用下面的代码,我可以DistinctBy这些项目和结果列表将有2项,并确定。

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

如果我注释行(//m.EmailAddresses)它不工作,并返回我5项。 我怎么能做到这一点独特?


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

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

链接地址: http://www.djcxy.com/p/51387.html

上一篇: DistinctBy when the property to distinct is a list

下一篇: Need C# Regex for replacing spaces inside of strings