2012-12-20 4 views
6

Possible en double:
Linq Distinct() use delegate for equality comparerComment utiliser l'expression lambda dans Distinct

J'ai besoin obtenir PostViewModel uniques par ID. Comment faire avec l'expression lambda?

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

comparateur:

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 
} 

désolé, c'est de doublon Use a delegate for the equality comparer for LINQ's Distinct()

+0

Ce serait génial si vous nous avez montré ce que vos classes ressemblent et comment ils se rapportent les uns aux autres. D'après ce que je comprends un employé contient une liste de poste qui contient des PostViewModels individuels? –

Répondre

2

Si je vous comprends bien, j'ai eu un problème similaire.

Basé sur this post, j'ai fait cette méthode d'extension

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

qui génère automatiquement la mise en œuvre IEqualityComparer nécessaire pour un lambda donné. Dans votre cas, qui permettrait d'utiliser quelque chose comme:

return Employees 
     .SelectMany(e => e.PostList.Posts) 
     .Distinct(postViewModel => postViewModel.ID) 
     .ToList(); 
Questions connexes