我编写了一个代码,基本上比较了 C# 中的两个列表。第一个列表包含如下属性:
- 元素编号
- 总浏览量
第一个列表缺少 TotalViews 的值,所以我从具有这些 Prop 的第二个列表中分配它们:
- 元素编号
- HitCount//这是 TotalViews 需要分配的属性
代码如下:
foreach (var item in parsedMerchantData)
{
var itemInB = HitCountItemIDS.FirstOrDefault(x => x.ItemID == item.ItemID);
if (itemInB != null)
{
if (itemInB.HitCount != -1)
{
item.TotalViews = itemInB.HitCount;
}
else
{
item.TotalViews = 0;
}
}
}
有没有更有效的方法来使用 LINQ 或实现自定义比较器来编写此代码,以便在有时包含 100000 个项目的较大列表上更快地工作?
最佳答案
这就像 jdweng 的回答,但稍微简单一点,它不会因缺少项目 ID 而抛出异常:
var hitCountsById = HitCountItemIDS.ToDictionary(x => x.ItemID, x => x.HitCount);
foreach (var item in parsedMerchantData)
{
int hitCount;
// We don't care about the return value of TryGetValue here...
hitCountsById.TryGetValue(item.ItemID, out hitCount);
item.HitCount = hitCount == -1 ? 0 : hitCount;
}
这应该是 O(N+M),其中 N 是 HitCountItemIDs
的大小,M
是 parsedMerchantData
的大小...因此,随着数据变大,它应该比合并排序方法增长得更慢,并且代码绝对更简单。 (它也不需要比较商品 ID 来进行订购 - 只是相等。)
关于C#/LINQ 比较两个列表和赋值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42350801/