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() 使用相等比较器的委托

4

1 回答 1

2

如果我理解正确,我也遇到过类似的问题。

基于这篇文章,我做了这个扩展方法

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source, 
                                         Func<T, object> keyExtractor)
{
  return source.Distinct(new KeyEqualityComparer<T>(keyExtractor));
}

它会为给定的 lambda 自动生成必要的 IEqualityComparer 实现。在您的情况下,这将能够使用类似的东西:

return Employees
         .SelectMany(e => e.PostList.Posts)
         .Distinct(postViewModel => postViewModel.ID)
         .ToList(); 
于 2012-12-20T07:31:10.253 回答