如何在Distinct中使用Lambda表达式

6

可能是重复问题:
Linq Distinct() 如何使用委托作为相等比较器

我需要通过ID获取唯一的PostViewModel。如何使用lambda表达式实现这个功能?

public IEnumerable<PostViewModel> DistinctPosts
{
  get 
  { 
    return Employees
             .SelectMany(e => e.PostList.Posts)
             .Distinct(new PostViewModelComparer())
             .ToList(); 
  }
}

比较器:

class PostViewModelComparer : IEqualityComparer<PostViewModel>
{
  #region IEqualityComparer<Contact> Members

  public bool Equals(PostViewModel x, PostViewModel y)
  {
    return x.ID.Equals(y.ID);
  }

  public int GetHashCode(PostViewModel obj)
  {
    return obj.ID.GetHashCode();
  }

  #endregion
}

很抱歉,这是从使用代理来进行LINQ Distinct()中的相等比较重复的内容。


如果您展示一下您的类长什么样子以及它们之间的关系,那就太好了。据我所知,一个员工包含一个职位列表,其中包含单个的PostViewModels? - Levi Botelho
1个回答

2
如果我理解正确的话,我也遇到过类似的问题。
根据这篇帖子,我已经编写了这个扩展方法。
public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source, 
                                         Func<T, object> keyExtractor)
{
  return source.Distinct(new KeyEqualityComparer<T>(keyExtractor));
}

自动生成所需的IEqualityComparer实现的代码,针对给定的lambda表达式。在您的情况下,这将使得可以使用类似以下的内容:
return Employees
         .SelectMany(e => e.PostList.Posts)
         .Distinct(postViewModel => postViewModel.ID)
         .ToList(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接