web-dev-qa-db-fra.com

Obtenir une liste de valeurs distinctes dans la liste

En C #, disons que j'ai une classe appelée Note avec trois variables de membre String.

public class Note
{
    public string Title;
    public string Author;
    public string Text;
}

Et j'ai une liste de type Note:

List<Note> Notes = new List<Note>();

Quel serait le moyen le plus simple d’obtenir une liste de toutes les valeurs distinctes dans la colonne Auteur?

Je pourrais parcourir la liste et ajouter toutes les valeurs qui ne sont pas dupliquées à une autre liste de chaînes, mais cela semble sale et inefficace. J'ai l'impression qu'il y a une construction magique de Linq qui le fera en une ligne, mais je n'ai rien pu trouver.

154
Darrel Hoffman
Notes.Select(x => x.Author).Distinct();

Cela retournera une séquence (IEnumerable<string>) de Author valeurs - une par valeur unique.

296
Kirk Woll

Distinct the Note class par auteur

var DistinctItems = Note.GroupBy(x => x.Author).Select(y => y.First());

foreach(var item in DistinctItems)
{
    //Add to other List
}
70
atik sarker

Jon Skeet a écrit une bibliothèque appelée morelinq qui a un opérateur DistinctBy(). Voir ici pour l'implémentation. Votre code ressemblerait à

IEnumerable<Note> distinctNotes = Notes.DistinctBy(note => note.Author);

Mise à jour: Après avoir relu votre question, Kirk a la bonne réponse si vous cherchez simplement un ensemble distinct d'auteurs.

Exemple ajouté, plusieurs champs dans DistinctBy:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList();
29
Dan Busha
public class KeyNote
{
    public long KeyNoteId { get; set; }
    public long CourseId { get; set; }
    public string CourseName { get; set; }
    public string Note { get; set; }
    public DateTime CreatedDate { get; set; }
}

public List<KeyNote> KeyNotes { get; set; }
public List<RefCourse> GetCourses { get; set; }    

List<RefCourse> courses = KeyNotes.Select(x => new RefCourse { CourseId = x.CourseId, Name = x.CourseName }).Distinct().ToList();

En utilisant la logique ci-dessus, nous pouvons obtenir l'unique Courses.

2
Bhaskar