Ho un array di ListViewItems (ListViewItem[]
), dove memorizzo un oggetto SalesOrderMaster
in ogni ListViewItem.Tag per un riferimento futuro.Come posso convertire il tipo anonimo in tipo forte in LINQ?
Ho un codice che in questo momento, passa attraverso ogni ListViewItem
cas in modo sicuro la proprietà .Tag in un oggetto SalesOrderMaster, quindi aggiunge quell'oggetto a una raccolta di SalesOrders, solo dopo aver verificato che l'ordine non esista già in quella raccolta.
Il processo per confronta gli ordini di vendita è costoso e vorrei convertirlo in un'espressione LINQ per chiarezza e prestazioni. (Ho anche installato il Parallel Extensions to .NET Framework 3.5 per migliorare ulteriormente le prestazioni LINQ)
Quindi, senza ulteriori indugi: questo è quello che ho, e poi quello che voglio. (Quello che voglio non si compila, quindi so che sto facendo qualcosa di sbagliato, ma spero che illustra il punto)
Quello che ho: (Slow)
foreach (ListViewItem item in e.Argument as ListViewItem[])
{
SalesOrderMaster order = item.Tag as SalesOrderMaster;
if (order == null)
{
return;
}
if (!All_SalesOrders.Contains(order))
{
All_SalesOrders.Add(order);
}
}
Quello che voglio: (Teoria)
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select new { ((SalesOrderMaster)item.Tag) }).Distinct();
EDIT: so che il cast è a buon mercato, ho detto la "Confronta", che in questo caso si traduce ai .Contains (ordine) funzionamento
EDIT: la risposta di tutti è stato fantastico! Vorrei poter segnare più di una risposta, ma alla fine devo sceglierne una.
EDIT: Questo è quello che ho finito con:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]) select (SalesOrderMaster) item.Tag).GroupBy(item => item.Number).Select(x => x.First()).ToList();
+1 per le informazioni su 'new {}' –
@ [Lucas] Ma come possiamo selezionare più campi usando questo metodo? C'è qualche alternativa all'utilizzo di un tipo anonimo? – Zesty
Ah, non importa, capito. seleziona nuova Persona (e.First_name, e.Last_name)) .Lista() –
Zesty