2014-05-21 14 views
5

Ho due modelli di oggetti che condividono alcune proprietà e un elenco di un tipo che desidero utilizzare per creare un elenco di un altro tipo. Per il momento, ho qualcosa di simile (e funziona):Mappare un elenco di modelli di oggetti su un altro elenco utilizzando linq

List<ObjectA> TheListOfObjectsA = the result of some query; 
List<ObjectB> TheListOfObjectsB = new List<ObjectB>(); 

foreach (ObjectA TheObjectA in TheListObjectsA) 
{ 
    ObjectB TheObjectB = new ObjectB(); 

    TheObjectB.Prop1 = TheObjectA.Prop1; 
    TheObjectB.Prop2 = TheObjectA.Prop2; 

    TheListOfObjectsB.Add(TheObjectB); 
} 

Sono curioso di sapere se e come ho potuto riscrivere questo in una dichiarazione LINQ senza il loop (anche pensato che sappiamo verrà eseguita l'istruzione LINQ come un loop).

Grazie.

risposta

15

Intendi questo?

var TheListOfObjectsB = TheListObjectsA.Select(a => new ObjectB() { Prop1 = a.Prop1, Prop2 = a.Prop2 }).ToList(); 
+0

Ok, bello e breve! A proposito, dovresti fare una modifica e aggiungere .ToList() alla fine :) – frenchie

+0

Thx, modificato. :) –

3
List<ObjectB> TheListOfObjectsB = TheListOfObjectsA 
    .Select(t => new ObjectB { 
     Prop1 = t.Prop1; 
     Prop2 = t.Prop2; 
    }).ToList(); 

si deve chiamare il metodo ToList() per ottenere un List<ObjectB>. Altrimenti, riceverai un IEnumerable<ObjectB>;

+0

no , questo non è un codice valido –

+0

OK, e perché no? –

+0

@Javad_Amiry: perché 'TheObjectA' non esiste nel contesto. –

1

è possibile utilizzare questo.

var theListOfObjectsB = theListOfObjectsA 
    .Select(t => new ObjectB{ 
     Prop1 = t.Prop1, 
     Prop2 = t.Prop2, 
    }); 
+0

, questo codice non è valido –

+0

Dovrebbe essere buono ora. Grazie per segnalarlo. – rageit

1

Si potrebbe utilizzare ConvertAll:

var output = listA.ConvertAll(new Converter<ObjectA, ObjectB>(ObjectAConverter)); 

e quindi definire il convertitore:

public static ObjectB ObjectAConverter(ObjectA a) 
{ 
    var b = new ObjectB(); 

    b.Prop1 = a.Prop1; 
    b.Prop2 = a.Prop2; 

    return b; 
} 

Facendo in questo modo, e definendo il metodo convertitore in un luogo pubblico, si significa che puoi fai questa conversione in qualsiasi momento senza dover duplicare la logica.

Per ulteriori brevità si potrebbe anche dichiarare il convertitore statico da qualche parte:

private static Converter<ObjectA, ObjectB> _converter = 
    new Converter<ObjectA, ObjectB>(ObjectAConverter); 
public static Converter<ObjectA, ObjectB> ObjectAConverter { get { return _converter; } } 

e quindi chiamare in questo modo:

var output = listA.ConvertAll(TypeName.ObjectAConverter); 
1

Questo dovrebbe aiutare ...

var theListOfObjectsB = (from e in theListOfObjectsA select new ObjectB{prop1 = e.prop1 ,prop2= e.prop2 }).ToList(); 
Problemi correlati