J'essaie de trouver un List<Author>
distinct, étant donné un List<BlogPost>
où BlogPost
a une propriété Author
. J'ai trouvé la méthode d'extension Distinct()
dans les génériques et j'essaie de l'utiliser. Tout d'abord, laissez-moi vous expliquer ma boucle et où je veux l'utiliser, puis je vais expliquer mes cours et où j'ai des problèmes.Résumé d'une implémentation IEqualityComparer ou remplacement du comparateur par défaut pour utiliser la méthode Distinct
Essayer d'utiliser ici distincte
public List<Author> GetAuthors() {
List<BlogPost> posts = GetBlogPosts();
var authors = new List<Author>();
foreach (var bp in posts) {
authors.Add(bp.Author);
}
return authors.Distinct().ToList();
}
Sur la base de ce que j'ai read on MSDN, Distinct()
utilise soit le comparateur par défaut ou un passé dans comparateur. J'espérais (je ne sais pas si c'est faisable) d'écrire un comparateur en un point et de pouvoir l'utiliser pour toutes mes classes puisqu'ils se comparent tous par la même opération d'égalité (qui compare la propriété GUID
de chaque classe).
Toutes mes classes héritent de la classe BasePage
:
public class BasePage : System.Web.UI.Page, IBaseTemplate, IEquatable<IBaseTemplate>, IEqualityComparer<IBaseTemplate>
public class Author : BasePage
public class BlogPost : BasePage
Ma méthode equals mis en œuvre BasePage
compare la propriété GUID
qui est unique à chacun. Quand j'appelle le Distinct()
sur un Author
cela ne semble pas fonctionner. Est-il possible que je puisse envelopper le comparateur à un endroit et pouvoir toujours l'utiliser plutôt que d'avoir à écrire quelque chose comme class AuhorComparer : IEqualityComparer<Auhor>
puisque j'aurais alors besoin d'écrire la même chose pour chaque classe, chaque fois que je veux utiliser Distinct()
. Ou puis-je remplacer le comparateur par défaut en quelque sorte, donc je ne dois rien passer à Distinct()
?
Merci pour la suggestion de HashSet. J'ai implémenté votre changement mais j'ai toujours une liste de la même taille. J'ai une liste de 3 posts, deux ont le même auteur, l'autre a un auteur complètement différent. Je reçois une liste de 3 auteurs cependant. –
Le fait que le HashSet contienne le même auteur plus d'une fois prouve-t-il que mes méthodes Equals et GetHashCode sont incorrectement écrites? –
J'ai confirmé que cela ne fonctionnait pas parce que ma méthode 'GetHashCode' n'était pas écrite correctement. Maintenant, j'ai cette approche avec le 'HashSet' fonctionnant. Merci! –