c# consente di ottenere un elenco da un campo all’interno di un elenco

Mi dispiace per la confusione titolo, ma non ho trovato un modo migliore per spiegare il mio problema.

Ho una lista di oggetti, myList, consente di chiamare MyObject. gli oggetti un aspetto simile a questo:

Class MyObject
{
    int MYInt{get;set;}
    string MYString{get;set;}
}

List<MyObject> myList;
...

Sto cercando un bel/short/modo di fantasia per creare un List<string> da myList, dove sto utilizzando solo il MyString proprietà.

Posso fare questo utilizzando myList.forEach(), ma mi chiedevo se c’è un modo più bello

Grazie!!

InformationsquelleAutor edan | 2010-09-01



3 Replies
  1. 16

    Con LINQ:

    var list = myList.Select(o => o.MYString);

    Che restituisce un IEnumerable<string>. Per ottenere un List<string> semplicemente aggiungere una chiamata a ToList():

    var list = myList.Select(o => o.MYString).ToList();

    Poi iterare i risultati, come si farebbe normalmente:

    foreach (string s in list)
    {
        Console.WriteLine(s);
    }
    • Potrebbe essere la pena di ricordare che se tutti si desidera fare è scorrere su di esso, non c’è bisogno ToList(). Utilizzare solo se è necessario modificare il nuovo elenco o di un indice in esso.
  2. 2

    Non c’è bisogno di LINQ se il vostro ingresso e di uscita liste sono entrambi Elenco<T>. È possibile utilizzare il ConvertAll metodo invece:

    List<string> listOfStrings = myList.ConvertAll(o => o.MYString);
    • beh, nel mio caso, l’input e l’output non sono la stessa cosa. ingresso Lista<MyObject> e di uscita è la Lista<string>. sarà convertAll() funzionano ancora?
    • Che cosa è “non c’è bisogno di LINQ” dovrebbe significare? Non è come LINQ è tutta una libreria separata o nulla, si sa. Se si utilizza .ConvertAll o .Select fa alcuna differenza pratica.
    • Sì, ConvertAll funzionano, come nel mio esempio di cui sopra.
    • Significa esattamente quello che dice: l’utilizzo di LINQ non è l’unica soluzione possibile; ConvertAll è un’altra alternativa. Infatti, ConvertAll sarà leggermente più efficiente rispetto a LINQ, perché a) e ‘ possibile copiare i dati con diretto accesso all’array piuttosto che dover istanziare e ripetutamente chiamata iteratori e b) è possibile allocare l’elenco di destinazione per la dimensione corretta all’inizio, piuttosto che il ridimensionamento dinamico come va. (Ma, come dici tu, questo piccolo vantaggio in termini di prestazioni non fa alcuna differenza pratica in più situazioni del mondo reale.)
  3. 1

    Ecco Ahmad risposta integrati di sintassi di query:

    var strings = from x in myList
                  select x.MYString;
    
    List<string> list = strings.ToList();

    Questo potrebbe anche essere scritta come:

    List<string> list = (from x in myList
                         select x.MYString).ToList();

Lascia un commento