it-swarm.com.de

Ruft eine Liste der unterschiedlichen Werte in List ab

Sagen wir in C #, ich habe eine Klasse namens Note mit drei String-Member-Variablen.

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

Und ich habe eine Liste des Typs Hinweis:

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

Was wäre der sauberste Weg, um eine Liste aller unterschiedlichen Werte in der Spalte Autor zu erhalten?

Ich könnte die Liste durchlaufen und alle Werte, die keine Duplikate sind, zu einer anderen Liste von Zeichenfolgen hinzufügen, aber dies scheint unsauber und ineffizient zu sein. Ich habe das Gefühl, dass es eine magische Linq-Konstruktion gibt, die dies in einer Zeile erledigt, aber ich konnte mir nichts einfallen lassen.

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

Dies gibt eine Sequenz zurück (IEnumerable<string>) von Author Werten - einer pro eindeutigem Wert.

296
Kirk Woll

Unterscheiden Sie die Note-Klasse nach Autor

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 hat eine Bibliothek namens morelinq geschrieben, die einen DistinctBy() -Operator hat. Siehe hier für die Implementierung. Ihr Code würde so aussehen

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

Update: Nach dem erneuten Lesen Ihrer Frage hat Kirk die richtige Antwort, wenn Sie nur nach einer bestimmten Gruppe von Autoren suchen.

Beispiel hinzugefügt, mehrere Felder in 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();

Unter Verwendung der obigen Logik können wir die eindeutigen Courses erhalten.

2
Bhaskar