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

标签 c# linq list c#-4.0 iequalitycomparer

我编写了一个代码,基本上比较了 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 的大小,MparsedMerchantData 的大小...因此,随着数据变大,它应该比合并排序方法增长得更慢,并且代码绝对更简单。 (它也不需要比较商品 ID 来进行订购 - 只是相等。)

关于C#/LINQ 比较两个列表和赋值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42350801/

相关文章:

c# - C# 7.x 中的对象解构用例

c# - 如何使用 C# (XNamespace/XElement) 导航 XML 文档

c# - LINQ on HashSet 与 List 的对比

c# - 尝试理解 LINQ 方法表示法

c# - 如何在身份(MVC5)的数据访问层中获取每个用户的用户角色?

java - 用文件删除常见英语单词

python - 如何重写 Pyqt 组合框 ItemText 方法以便它返回默认的 python 字符串而不是 QString?

c# - MVC Visual Studio 在模型文件夹中添加 .dbml 文件

c# - 针对本地主机相对 url "Cannot assign requested address"的请求

c# - 在 asp.net MVC 中开始模拟的好的模拟框架是什么? (新手,可能不是铁杆 mock 者)