Come posso usare Linq per ottenere un elenco univoco di proprietà da un elenco di oggetti?


171

Sto cercando di usare Linq per restituire un elenco di ID dato un elenco di oggetti in cui l'id è una proprietà. Mi piacerebbe essere in grado di farlo senza passare in rassegna ogni oggetto ed estrarre gli ID unici che trovo.

Ho un elenco di oggetti di tipo MyClass e una delle proprietà di questa classe è un ID.

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

Quello che voglio fare è scrivere una query Linq per restituirmi un elenco di quegli ID

Come posso fare ciò dato IList<MyClass>che restituisce uno IEnumerable<int>degli ID?

Sono sicuro che deve essere possibile farlo in una o due righe usando Linq piuttosto che scorrere ogni elemento nell'elenco MyClass e aggiungere i valori univoci in un elenco.

Qualsiasi aiuto nella creazione di una soluzione elegante sarebbe molto apprezzato!


1
Nota anche che hai DistinctByin MoreLinq che ti darà una distinzione MyClassbasata su ID. Utilizzo:var distincts = list.DistinctBy(x => x.ID);
nawfal,

Risposte:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

Wow! Pensavo fosse qualcosa di semplice ... non riuscivo proprio a pensarci. Sembra che dovrò passare ancora un po 'di tempo a familiarizzare con Linq.
mezoide,

29

Utilizzare l' operatore Distinct :

var idList = yourList.Select(x=> x.ID).Distinct();

5
(punto di denominazione minore; non è un "elenco" di ID - è un IEnumerable <int> valutato pigramente - a meno che non si chiami. ToList (), ovviamente ;-p)
Marc Gravell

@Marc, una semplice spiegazione su 2 righe di Lazy Eval? Per favore e grazie: D
masfenix,

2
@masfenix Lazy eval indica che l'operazione non viene eseguita fino a quando non viene effettivamente utilizzata. In questo caso, la selezione degli ID e la scelta solo di quelli distinti non viene necessariamente eseguita quando viene eseguita l'istruzione in questa risposta. Sarà fatto quando inizierai effettivamente a attraversare la lista id, ad esempio in un ciclo foreach.
Mark Meuer,

13

Utilizzando Straight Linq , con l' Distinct()estensione:

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

PRODUZIONE

1234567890


1
Non risponde alla domanda e, anche se lo fa, non aggiunge nulla di nuovo.
nawfal,

2

Quando prendiamo Distinct dobbiamo anche lanciare IEnumerable. Se la lista è un modello, è necessario scrivere il codice in questo modo

 IEnumerable<T> ids = list.Select(x => x).Distinct();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.