2012-04-21 40 views
103

En C#, supongamos que tengo una clase llamada Nota con tres variables de miembro de cadena.Obtenga una lista de valores distintos en la Lista

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

Y tengo una lista de tipo Nota:

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

¿Cuál sería la forma más limpia para obtener una lista de todos los valores distintos en la columna de Autor?

Pude iterar por la lista y agregar todos los valores que no son duplicados a otra lista de cadenas, pero esto parece sucio e ineficiente. Tengo la sensación de que hay una construcción mágica de Linq que hará esto en una línea, pero no he podido encontrar nada.

Respuesta

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

Esto devolverá una secuencia (IEnumerable<string>) de Author valores - uno por valor único.

+0

Notes.Select (x => x.Author) .AsParallel(). Distinct(); "AsParallel()" puede brindar algún beneficio de rendimiento, si no nos importa el orden y tenemos más elementos en la lista. – Sai

+1

@Kiquenet, distinto teniendo en cuenta el comparador de igualdad 'Default'. https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx –

+0

¿Necesitamos agregar ToList() antes de .Distinct()? –

24

Jon Skeet ha escrito una biblioteca llamada morelinq que tiene un operador DistinctBy(). Ver here para la implementación. Su código se vería así

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

Actualización: Después de volver a leer su pregunta, Kirk tiene la respuesta correcta si lo que buscas es un conjunto distinto de Autores.

muestra añadida, varios campos en 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 error 404 – Kiquenet

+0

Se ha actualizado el enlace al origen de DistinctBy. –

+0

Excelente, gracias. Me encanta que mantenga el orden correcto si ordeno la lista antes de llamar al método Distinct. – Vilhelm

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

¿Qué es exactamente mci? ¿Solo una mesa de ejemplo? La respuesta es un poco incómoda como es. –

+0

Sí, no creo que esto haga lo que mi pregunta original estaba buscando (no importa que fue hace un año y medio y el proyecto ha terminado hace mucho). Por lo que puedo decir, esto funcionaría si ya tuviera una lista de cadenas de Autor que pudieran contener duplicados, pero no podría usarse para extraer dicha lista de una lista de objetos que tienen la cadena Autor como uno de sus campos. –

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(); 

Mediante el uso de la lógica por encima de lo que podamos cursos únicos.

Cuestiones relacionadas