如何在LINQ中将匿名类型转换为强类型?

Rus*_*uss 18 c# linq .net-3.5

我有一个ListViewItems(ListViewItem[])数组,我SalesOrderMaster在每个ListViewItem.Tag中存储一个对象供以后参考.

我有一些代码,现在,经过各ListViewItem安全铸就.TAG财产成SalesOrderMaster对象,然后添加该对象SalesOrders表的集合,只检查,以确保订单已不存在该集合中后.

比较销售订单的过程非常昂贵,我想将其转换为LINQ表达式以获得清晰度和性能.(我还安装了.NET Framework 3.5Parallel 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.Tagnew { },因此它不会创建匿名类型.另请注意我添加,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因此返回的类型在示例中很清楚.)