【问题标题】:Removing items based on two lists根据两个列表删除项目
【发布时间】:2019-06-23 19:00:20
【问题描述】:

我有两个列表,一个是字符串列表,另一个是称为“ItemTransactions”的复杂类型列表。

第一个列表包含 ItemID 的列表,并且基于该第一个列表,无论“ItemTransactinos”列表中的 ItemID 出现在何处,都必须将其删除...

按照以下传统方式进行操作非常慢,因为两个列表都很大:

foreach (var item in ItemIDs) // ItemIDs is lsit of strings 
{
  itemTransactions.Remove(/*remove*/); // 1 itemID can occur multiple times in this list... So I would like to remove all items in this collections that correspond 1 ItemID at once if possible?
}

有人可以帮我解决这个问题吗?

附: ItemTransactions 集合包含名为“ItemID”的属性,它也是字符串类型......请注意

【问题讨论】:

  • 所以问题是性能,您正在寻找有关如何优化的建议?您可能想要包含一个 MVCE 和一个示例数据集。
  • @ChrisPickford 是的,而且基本上如何一次删除属于 1 个 ItemID 的多个事务......我不知道如何以有效的方式完成,因为两个列表都可以相当大吗?
  • 你就不能根据ItemList.Where(i => !StringList.Contains(i.ItemID)做点什么吗?
  • @nalka 最终产品需要是没有来自 ItemID 列表的所有 itemid 的列表(复杂类型):D
  • @nalka 但好点:D

标签: c# asp.net-mvc list asp.net-mvc-4 removeall


【解决方案1】:

你可以使用RemoveAll:

itemTransactions.RemoveAll(i => ItemIDs.Contains(i.ItemID));

不确定这是否更快,但它更简洁明确。您最终将不得不测试不同的选项,以查看哪些代码对您来说性能更好。

【讨论】:

  • 如果ItemIDs 是一个长列表,请先将其转换为HashSet<string>。这也将提高速度。
  • 这不是很好,这个方法是在列表上定义的,而不是在 iqueryable 上定义的(根据您发送的链接),它将在内存中过滤而不是在数据库中
  • @nalka 我在 OPs 问题中没有看到提到 IQueryable 或与数据库有关的任何内容
  • 他提到了 ID,这让我想到了这一点,但无论如何我的评论都是相关的,因为除了 User987 之外的其他人可能会检查这个答案并使用它,即使他们与 User987 不在完全相同的上下文中跨度>
【解决方案2】:
ItemList.Where(item => !StringList.Contains(item.ItemID);

可以满足您的需求。

【讨论】:

  • 如果 ItemIDs 是一个长的内存列表,首先将其转换为 HashSet (或者从一开始就使用 HashSet)。这也将提高速度。
猜你喜欢
  • 1970-01-01
  • 2017-03-02
  • 2020-03-15
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
相关资源
最近更新 更多