Como uso o Linq para obter uma lista exclusiva de propriedades de uma lista de objetos?

171

Estou tentando usar o Linq para retornar uma lista de ids, dada uma lista de objetos em que o id é uma propriedade. Eu gostaria de poder fazer isso sem percorrer cada objeto e retirar os IDs únicos que encontro.

Eu tenho uma lista de objetos do tipo MyClass e uma das propriedades dessa classe é um ID.

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

O que eu quero fazer é escrever uma consulta Linq para retornar uma lista desses IDs

Como faço isso dado IList<MyClass>que retorna um IEnumerable<int>dos IDs?

Tenho certeza de que deve ser possível fazê-lo em uma ou duas linhas usando o Linq, em vez de percorrer cada item da lista MyClass e adicionar os valores exclusivos a uma lista.

Qualquer ajuda na criação de uma solução elegante seria muito apreciada!

mezoid
fonte
1
Observe também que você tenha DistinctByem MoreLINQ que lhe dará distintos MyClasss baseado em ID. Uso:var distincts = list.DistinctBy(x => x.ID);
nawfal 29/11

Respostas:

319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();
Marc Gravell
fonte
Uau! Eu pensei que era algo simples ... eu simplesmente não conseguia pensar nisso. Parece que vou ter que gastar mais tempo me familiarizando com o Linq.
mezoid
29

Use o operador Distinct :

var idList = yourList.Select(x=> x.ID).Distinct();
CMS
fonte
5
(ponto de nomenclatura menor; não é uma "lista" de IDs - é um IEnumerable <int> avaliado preguiçosamente - a menos que você chame .ToList (), é claro ;-p))
Marc Gravell
@ Marc, uma explicação simples de 2 linhas de avaliação preguiçosa? Por favor, obrigado: D
masfenix
2
@masfenix Lazy eval significa que a operação não é concluída até que seja realmente usada. Nesse caso, a seleção dos IDs e a escolha apenas dos distintos não são necessariamente feitos quando a declaração nesta resposta é executada. Isso será feito quando você realmente começar a percorrer a idList, por exemplo, em um loop foreach.
Mark Meuer
13

Usando Linq direto , com a Distinct()extensão:

var idList = (from x in yourList select x.ID).Distinct();
Dana
fonte
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);
        }

RESULTADO

1234567890

Águia Negra
fonte
1
Não responde à pergunta e, mesmo se responder, não acrescenta nada de novo.
Nawfal # 29/13
2

Ao usar o Distinct, também temos que converter o IEnumerable. Se a lista for modelo significa, é necessário escrever um código como este

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