gpt4 book ai didi

c# - 从列表 2 中过滤列表 1

转载 作者:行者123 更新时间:2023-11-30 19:54:36 25 4
gpt4 key购买 nike

我遇到了性能问题。

我得到列表包含(50k 项)列表包含(120k 项)

WholeSaleEntry 是

public class WholeSaleEntry
{
public string SKU { get; set; }
public string Stock { get; set; }
public string Price { get; set; }
public string EAN { get; set; }
}

和产品列表

public class ProductList
{
public string SKU { get; set; }
public string Price { get; set; }
public string FinalPrice { get; set; }
public string AlternateID { get; set; }

}

我需要通过 EAN 和 SKU 过滤 WholeSaleEntry,以防它们的 EAN 或 SKU 在 ProductList.AlternateID 中我写了这段有效的代码,但性能真的很慢

       List<WholeSaleEntry> filterWholeSale(List<WholeSaleEntry> wholeSaleEntry, List<ProductList> productList)
{
List<WholeSaleEntry> list = new List<WholeSaleEntry>();
foreach (WholeSaleEntry item in wholeSaleEntry)
{
try
{
string productSku = item.SKU;
string productEan = item.EAN;
var filteredCollection = productList.Where(itemx => (itemx.AlternateID == productEan) || (itemx.AlternateID == productSku)).ToList();

if (filteredCollection.Count > 0)
{
list.Add(item);
}
}
catch (Exception)
{
}
}

return list;
}

有没有更好的过滤系统或者可以批量过滤的东西?

最佳答案

.Where(...).ToList()的使用会找到每一个匹配项,最后只需要知道是否有匹配项即可。可以使用 Any(...) 修复一旦找到匹配项就会停止,如下所示:

var hasAny = productList.Any(itemx => itemx.AlternateID == productEan || itemx.AlternateID == productSku);
if (hasAny)
{
list.Add(item);
}


更新:算法可以简化成这样。首先使用 HashSet 获取唯一的备用 ID ,它只存储一次重复项,而且查找速度非常快。然后获取与之匹配的所有 WholeSale 商品。
不会有很多更快的策略,而且代码量小,我觉得容易理解。

var uniqueAlternateIDs = new HashSet<string>(productList.Select(w => w.AlternateID));
var list = wholeSaleEntry
.Where(w => uniqueAlternateIDs.Contains(w.SKU)
|| uniqueAlternateIDs.Contains(w.EAN))
.ToList();
return list;

快速测试表明,对于 50k + 50k 项,使用 HashSet<string>花了 28 毫秒得到答案。使用 List<string>使用 .Distinct().ToList() 填充花了 48 秒,所有其他代码都相同。

关于c# - 从列表 2 中过滤列表 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41285868/

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