2013-05-23 6 views
15

Nel mio codice Mi capita spesso di avere le sequenze come:Come fare la comprensione degli elenchi (modo compatto per trasformare una lista in un'altra lista) in C#?

List<type1> list1 = ...; 
List<type2> list2 = new List<type2>(); 
foreach(type1 l1 in list1) 
{ 
    list2.Add(myTransformFunc(l1)); 
} 

In Python, posso scrivere come

list2 = [myTransformFunc(l1) for l1 in list1] 

Esiste un modo compatto per scrivere in C#?

+1

Il tuo esempio python non è realmente una trasformazione, ma una lista di comprensione. Vedi http://en.wikipedia.org/wiki/List_comprehension –

+0

Nota che Eric Lippert suggerisce di utilizzare foreach in questo caso. Sono un grande fan delle list comprehensions, ma dopo aver letto il suo post su questo (http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx) ero convinto. –

risposta

24
var newList = list.Select(x => YourTransformFunc(x)).ToList(); 

Oppure:

var newList = list.Select(YourTransformFunc).ToList(); 

firma Func dovrebbe essere:

type2 YourTransformFunc(type1 value) 
{ 
} 

Edit:

metodi di estensione Select e ToList sono in System.Linq namespace.

+0

c'è un nome/modulo speciale per il tipo di espressione 'x => YourTransformFunc (x)'? –

+4

@YuliaV Sì, si chiama espressioni lambda. Leggere prima i delegati e poi circa [espressioni lambda] (http://msdn.microsoft.com/en-us/library/bb397687.aspx). – Leri

+0

espressione lambda? http://msdn.microsoft.com/en-us/library/bb397687.aspx – booyaa

7

State pensando a questo:

list1.ForEach(x=> list2.Add(myTransformFunc(x)));