【问题标题】:whats the fastest way to write join in linq什么是在 linq 中编写加入的最快方法
【发布时间】:2017-08-04 15:55:01
【问题描述】:

我有 2 个类用户(count-10k),address(count-100 万)。这些就像一对多。

我正在尝试为用户映射地址。

使用列表(需要几分钟):

 List<User> us = usrs.Select(u => new User { id = u.id ,email=u.email,name=u.name,addresses=adrs.Where(a=>a.userid==u.id).ToList()}).ToList();

上述方法有效,但速度很慢

我把它改成使用字典和它的速度。

使用字典(需要几秒钟):

var dusrs = usrs.ToDictionary(usr => usr.id);
        var daddrs = adrs.ToDictionary(adr => Tuple.Create(adr.id,adr.userid));
        foreach (var addr in daddrs)
        {

            var usr = dusrs[addr.Value.userid];
            if (usr.addresses == null)
            {
                usr.addresses = new List<Address>();

            }
            usr.addresses.Add(addr.Value);
        }

有什么方法可以让我使用列表而不是字典来编写更好的查询?

我只是想看看我是否可以使用列表编写更好的 linq

谢谢...

Vamsee

【问题讨论】:

  • 我投票结束这个问题,因为它是一个评论,因此应该去 codereview.stackexchange.com
  • 看看GroupJoin方法或join into
  • 您可以使用adrs.ToLookUp(k =&gt; k.userid) 之类的查找,然后按用户ID 从查找中提取地址列表。
  • 类不包含计数 - 你有 Lists 的 useraddress 或其他一些集合类型吗?
  • 我们能否假设 user 集合在某些条件下比原来的集合减少了,这就是为什么每个用户有 100 个地址?

标签: c# performance list linq dictionary


【解决方案1】:

假设您出于某种原因将用户和地址保留在 Lists 中,您可以在 LINQ 中使用 join,它将结合两个 lists 并在内部使用散列数据结构将它们放在一起:

var us2 = (from u in usrs
          join a in adrs on u.id equals a.userid into aj
          select new User { id = u.id, email = u.email, name = u.name, addresses = aj.Select(a => a).ToList() }).ToList();

或者,您可以将地址转换为Lookup 并使用它,但最好将地址保留在Lookup 中,或者如果可能的话最初在Lookup 中创建它们:

var addressLookup = adrs.ToLookup(a => a.userid);
List<User> us = usrs.Select(u => new User { id = u.id, email=u.email, name=u.name, addresses=addressLookup[u.id].ToList() }).ToList();

在我的测试用例中,哪个更快似乎取决于有多少用户与地址匹配。

【讨论】:

  • 删除了我的答案,因为它与你的相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多