C#/ LINQ比较两个列表和分配值的最快方法

Use*_*987 4 c# linq list iequalitycomparer c#-4.0

我编写了一个代码,该代码基本上比较了C#中的两个列表。第一个列表包含以下属性:

  • 物品ID
  • 总浏览

第一个列表缺少TotalViews的值,因此我从第二个列表中为它们分配了这些道具:

  • 物品ID
  • 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何更有效的方式使用LINQ编写此代码或实现自定义比较器,该自定义比较器在有时包含100000个项目的较大列表上工作更快?

Jon*_*eet 5

这就像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;
}
Run Code Online (Sandbox Code Playgroud)

这应该是O(N + M),其中N是...的大小,HitCountItemIDs并且M是...的大小parsedMerchantData。因此,当数据变大时,它应该比合并排序方法增长得更慢,并且绝对是更简单的代码。(也不需要比较商品ID进行订购-只需相等即可。)