我有一个ListViewItems数组(ListViewItem[]
),其中我每个ListViewItem.Tag中存储一个SalesOrderMaster
对象以供稍后引用。
我有一些代码,它现在可以安全地遍历每个ListViewItem
,将.Tag属性安全强制转换为SalesOrderMaster对象,然后仅在检查订单在该集合中不存在后,将该对象添加到SalesOrders集合中。
比较销售订单的过程很耗费时间,因此我希望将其转换为LINQ表达式以提高清晰度和性能。(我还安装了.NET Framework 3.5的并行扩展,以便进一步提高LINQ的性能)
所以,话不多说:这是我有的内容,以及我想要的内容(我想要的内容无法编译,所以我知道我做错了什么,但我希望它可以说明问题)
我目前的代码:(慢)
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();
编辑:我知道转换很便宜,我的意思是“比较”,在这种情况下相当于.Contains(order)操作。
编辑:每个人的答案都很棒!我希望我可以选择多个答案,但最终我必须选择一个。
编辑:这就是我最终采用的方法:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]) select (SalesOrderMaster) item.Tag).GroupBy(item => item.Number).Select(x => x.First()).ToList();