2012-04-21 16 views
103

In C#, dire che ho una classe chiamata Note con tre variabili membro String.Ottenere un elenco di valori distinti nell'elenco

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

E ho una lista di tipo Nota:

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

Quale sarebbe il modo più pulito per ottenere un elenco di tutti i valori distinti nella colonna Autore?

Potrei scorrere l'elenco e aggiungere tutti i valori che non sono duplicati in un altro elenco di stringhe, ma questo sembra sporco e inefficiente. Ho la sensazione che ci sia una costruzione magica di Linq che lo farà in una riga, ma non sono stato in grado di inventare nulla.

risposta

209
Notes.Select(x => x.Author).Distinct(); 

Ciò restituirà una sequenza (IEnumerable<string>) di Author valori - una per ogni valore unico.

+0

Note.Seleziona (x => x.Autore) .AsParallel(). Distinct(); "AsParallel()" potrebbe dare qualche vantaggio in termini di prestazioni, se non ci interessa l'ordine e avere più elementi nell'elenco. – Sai

+1

@Kiquenet, distinto considerando il confronto di uguaglianza 'Default'. https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx –

+0

È necessario aggiungere ToList() prima di .Distinct()? –

24

Jon Skeet ha scritto una libreria denominata morelinq che dispone di un operatore DistinctBy(). Vedi here per l'implementazione. Il tuo codice sarà simile

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

Aggiornamento: dopo aver riletto la tua domanda, Kirk ha la risposta giusta se siete solo in cerca di una serie distinta di autori.

Aggiunto campione, diversi campi in DistinctBy:

res = res.DistinctBy(i => i.Name).DistinctBy(i => i.ProductId).ToList(); 
+0

https://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/DistinctBy.cs errore 404 – Kiquenet

+0

Il collegamento all'origine DistinctBy è stato aggiornato. –

+0

Eccellente, grazie. Mi piace che mantenga l'ordine corretto se ordino l'elenco prima di chiamare il metodo Distinct. – Vilhelm

-1
mcilist = (from mci in mcilist select mci).Distinct().ToList(); 
+0

Che cosa è esattamente mci? Solo un tavolo di esempio? La risposta è un po 'imbarazzante come è. –

+0

Sì, non penso che questo faccia quello che cercava la mia domanda originale (non importa se è stato un anno e mezzo fa e il progetto è finito da tempo). Da quello che posso dire, questo funzionerebbe se avessi già un elenco di stringhe Author che potrebbero contenere duplicati, ma non potrebbe essere usato per estrarre una lista da un elenco di oggetti che hanno la stringa Author come uno dei loro campi. –

40
var DistinctItems = employees.GroupBy(x => x.EmpID).Select(y => y.First()); 

foreach(var item in DistinctItems) 
{ 
    //Add to other List 
} 
0
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(); 

Utilizzando sopra logica possiamo corsi unici.

Problemi correlati