У меня есть массив ListViewItems (ListViewItem[]
), где я храню объект SalesOrderMaster
в каждом элементе ListViewItem.Tag для последующей ссылки.
У меня есть некоторый код, который прямо сейчас, через каждый ListViewItem
безопасно передает свойство .Tag в объект SalesOrderMaster, а затем добавляет этот объект в коллекцию SalesOrders, только после проверки, чтобы убедиться, что заказ еще не установлен существуют в этой коллекции.
Процесс сравнивать заказы на продажу является дорогостоящим, и я хотел бы преобразовать его в выражение LINQ для ясности и производительности. (У меня также есть Parallel Extensions to.NET Framework 3.5, поэтому я могу использовать его для дальнейшего улучшения производительности LINQ)
Итак, без дальнейших церемоний: Это то, что у меня есть, а затем то, что я хочу. (то, что я хочу, не будет компилироваться, поэтому я знаю, что я делаю что-то неправильно, но надеюсь, что это иллюстрирует суть)
Что у меня: (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);
}
}
Что я хочу: (Теория)
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select new { ((SalesOrderMaster)item.Tag) }).Distinct();
EDIT: Я знаю, что акция дешевая, я сказал "Сравнить", которая в этом случае переводит на операцию .Contains(order)
EDIT: Каждый ответ был потрясающим! Хотел бы я отметить более одного ответа, но в конце концов я должен выбрать один.
EDIT: Это то, с чем я закончил:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]) select (SalesOrderMaster) item.Tag).GroupBy(item => item.Number).Select(x => x.First()).ToList();