¿Cómo uso Linq para obtener una lista única de propiedades de una lista de objetos?

171

Estoy tratando de usar Linq para devolver una lista de identificadores dada una lista de objetos donde el ID es una propiedad. Me gustaría poder hacer esto sin recorrer cada objeto y extraer los identificadores únicos que encuentro.

Tengo una lista de objetos de tipo MyClass y una de las propiedades de esta clase es una ID.

public class MyClass
{
  public int ID { get; set; }
}

Lo que quiero hacer es escribir una consulta de Linq para devolverme una lista de esos Ids

¿Cómo hago eso dado un IList<MyClass>tal que devuelve uno IEnumerable<int>de los identificadores?

Estoy seguro de que debe ser posible hacerlo en una o dos líneas usando Linq en lugar de recorrer cada elemento en la lista MyClass y agregar los valores únicos en una lista.

¡Cualquier ayuda para crear una solución elegante sería muy apreciada!

mezoide
fuente
1
También tenga DistinctByen cuenta que tiene en MoreLinq que le dará distintos MyClasss basados ​​en ID. Uso:var distincts = list.DistinctBy(x => x.ID);
nawfal

Respuestas:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
fuente
¡Guauu! Pensé que era algo simple ... Simplemente no podía pensar en eso. Parece que voy a tener que pasar más tiempo familiarizándome con Linq.
mezoid
29

Use el operador distinto :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
fuente
55
(punto de nomenclatura menor; no es una "lista" de identificadores; es un IEnumerable <int> evaluado perezosamente, a menos que llame a .ToList (), por supuesto ;-p)
Marc Gravell
@Marc, ¿una simple explicación de 2 líneas de evaluación perezosa? Por favor y gracias: D
masfenix
2
@masfenix Lazy eval significa que la operación no se realiza hasta que se usa realmente. En este caso, la selección de las ID y elegir solo las distintas no se realiza necesariamente cuando se ejecuta la declaración en esta respuesta. Se realizará cuando realmente comience a recorrer la idList, por ejemplo, en un bucle foreach.
Mark Meuer
13

Usando Linq recto , con la Distinct()extensión:

var idList = (from x in yourList select x.ID).Distinct();
Dana
fuente
3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

SALIDA

1234567890

Aguila Negra
fuente
1
No responde la pregunta, e incluso si lo hace, no agrega nada nuevo.
nawfal
2

Al tomar Distinct, también tenemos que usar IEnumerable. Si la lista es modelo significa, necesita escribir código como este

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Pergin Sheni
fuente