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.
Notes.Select(x => x.Author).Distinct();
Cela retournera une séquence (IEnumerable<string>
) de Author
valeurs - une par valeur unique.
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
}
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();
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 Course
s.