我有一个ListViewItems(ListViewItem[])数组,我SalesOrderMaster在每个ListViewItem.Tag中存储一个对象供以后参考.
我有一些代码,现在,经过各ListViewItem安全铸就.TAG财产成SalesOrderMaster对象,然后添加该对象SalesOrders表的集合,只检查,以确保订单已不存在该集合中后.
比较销售订单的过程非常昂贵,我想将其转换为LINQ表达式以获得清晰度和性能.(我还安装了.NET Framework 3.5的Parallel Extensions,因此我可以使用它来进一步提高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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要的是:(理论)
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select new { ((SalesOrderMaster)item.Tag) }).Distinct();
Run Code Online (Sandbox Code Playgroud)
编辑:我知道演员阵容便宜,我说"比较",在这种情况下转换为.Contains(顺序)操作
编辑:每个人的回答都很棒!我希望我可以标记多个答案,但最后我必须选择一个.
编辑:这是我最终得到的:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]) select (SalesOrderMaster) item.Tag).GroupBy(item => item.Number).Select(x => x.First()).ToList();
Run Code Online (Sandbox Code Playgroud)
Luc*_*cas 18
我看到没有人明确表示你需要将匿名类型转换为命名类型,所以这里...通过使用" select new { }"你创建一个匿名类型,但你不需要.您可以像这样编写查询:
List<SalesOrderMaster> orders =
(from item in (e.Argument as ListViewItem[]).AsParallel()
select (SalesOrderMaster)item.Tag)
.Distinct()
.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,查询选择(SalesOrderMaster)item.Tag不new { },因此它不会创建匿名类型.另请注意我添加,ToList()因为你想要一个List<SalesOrderMaster>.
这解决了您的匿名类型问题.但是,我同意Mark和Guffa的说法,在这里使用并行查询不是最佳选择.要使用HashSet<SalesOrderMaster>Guffa建议,您可以这样做:
IEnumerable<SalesOrderMaster> query =
from item in (ListViewItem[])e.Argument
select (SalesOrderMaster)item.Tag;
HashSet<SalesOrderMaster> orders = new HashSet<SalesOrderMaster>(query);
Run Code Online (Sandbox Code Playgroud)
(我避免使用,var因此返回的类型在示例中很清楚.)
| 归档时间: |
|
| 查看次数: |
34101 次 |
| 最近记录: |