¿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!


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

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

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

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


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.