gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:49:07 29 4
gpt4 key购买 nike

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

我现在有一些代码,通过每个 ListViewItem 安全地将 .Tag 属性转换为 SalesOrderMaster 对象,然后将该对象添加到 SalesOrders 集合,只有在检查以确保该集合中尚不存在订单。

比较 销售订单的过程非常昂贵,为了清晰和性能,我想将其转换为 LINQ 表达式。 (我还安装了 Parallel Extensions to .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();

最佳答案

我看到没有人明确地解决了将匿名类型转换为命名类型的需要,所以这里开始......通过使用“select new { }”,您正在创建一个匿名类型,但您不需要这样做。你可以这样写你的查询:

List<SalesOrderMaster> orders = 
(from item in (e.Argument as ListViewItem[]).AsParallel()
select (SalesOrderMaster)item.Tag)
.Distinct()
.ToList();

注意查询选择了(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);

(我避免使用 var,因此返回的类型在示例中很清楚。)

关于c# - 如何在 LINQ 中将匿名类型转换为强类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802256/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com