Mam tablica ListViewItems (ListViewItem[]
), gdzie przechowuję obiekt SalesOrderMaster
w każdym ListViewItem.Tag do późniejszego odniesienia.Jak przekonwertować typ anonimowy na silny typ w LINQ?
Mam teraz kod, który przechodzi przez każdy ListViewItem
bezpiecznie rzuca właściwość .Tag do obiektu SalesOrderMaster, a następnie dodaje ten obiekt do kolekcji SalesOrders, dopiero po sprawdzeniu, aby upewnić się, że zamówienie jeszcze nie istnieje w tym zbiorze.
Proces do porównać zamówień sprzedaży jest kosztowne, a ja chciałbym przekonwertować to do wyrażenia LINQ dla przejrzystości i wydajności. (Mam również zainstalowany Parallel Extensions to .NET Framework 3.5, więc mogę go użyć, aby jeszcze bardziej poprawić wydajność LINQ).
Więc bez dalszych ceregieli: To jest to, co mam, a następnie to, czego chcę. (Co chcę nie będzie kompilować, więc wiem, że robię coś złego, ale mam nadzieję, że ilustruje punkt)
Co mam: (powolny)
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);
}
}
Czego chcę: (teoria)
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select new { ((SalesOrderMaster)item.Tag) }).Distinct();
EDIT: wiem, że obsada jest tani, powiedziałem „Porównaj”, która w tym przypadku przekłada się na .Contains (kolejności) operacja
EDIT: odpowiedź każdego człowieka było niesamowite! Chciałbym zaznaczyć więcej niż jedną odpowiedź, ale ostatecznie muszę wybrać jedną.
EDIT: To jest to, co skończyło się z:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]) select (SalesOrderMaster) item.Tag).GroupBy(item => item.Number).Select(x => x.First()).ToList();
+1 dla informacji o 'nowym {}' –
@ [Lucas] Ale jak możemy wybrać wiele pól za pomocą tej metody? Czy jest jakaś alternatywa dla używania anonimowego typu? – Zesty
Ach, nieważne, rozumiem. wybierz nową osobę (e.Nazwa, e.Last_name)). ToList() –
Zesty