gpt4 book ai didi

c# - Linq从其他列表性能中选择匹配列表

转载 作者:太空狗 更新时间:2023-10-29 18:02:17 25 4
gpt4 key购买 nike

我有这样一个类

public class Category 
{
CategoryID
List<Product> ProductList
}
public class Product
{
CategoryID
}

List<Category>大约 15k 行和 List <Product>大约 40k 行。我正在像这样使用 LINQ

CategoryList.ForEach(i =>
{
i.ProductList = ProductList.Where(x => x.CategoryID == i.CategoryID).ToList();
});

我想知道是否有更好的性能实现。在其他情况下数据可能会增加或减少

最佳答案

我认为使用并行性是愚蠢的,因为对算法的简单更改可以将其速度提高一千倍。假设 CategoryID 有一个不错的 GetHashCode() 实现,与 O 相比,字典/查找的查找时间接近 O(1) (n) 扫描列表的时间。

两种可能的方法:

将类别变成字典

假设类别具有您可以使用的唯一 ID:

var categoryById = categories.ToDictionary(c => c.CategoryID);
foreach(var product in products)
{
var category = categoryById[product.CategoryID];
category.Products.Add(product);
}

这具有运行时 O(products.Count + categories.Count) 并使用 O(categories.Count) 内存。

如果类别不是以空列表开头,您可能需要创建它。

将产品变成查找

var productsByCategory = products.ToLookup(product => product.CategoryID);
foreach(var category in categories)
{
category.Products = products[category.CategoryID].ToList();
}

这具有运行时 O(products.Count + categories.Count) 并使用 O(products.Count) 内存。

由于产品通常多于类别,因此此方法需要更多内存。另一方面,查找可能消除了在类别对象中嵌入产品列表的需要。

关于c# - Linq从其他列表性能中选择匹配列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32044346/

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