2017-08-04 55 views
0

我有2類用戶(count-10k),地址(count-1million)。這些就像一對多。什麼是最快的方式來寫linq

我正在嘗試爲用戶映射地址。

使用列表(需要幾分鐘):

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

+0

我投票結束這個問題作爲題外話,因爲它是一個審查,因此應該去codereview.stackexchange.com – HimBromBeere

+1

看看['GroupJoin'](https://msdn.microsoft.com /en-us/library/bb534297(v=vs.110).aspx)方法或[加入](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/join - 條款) –

+0

您可以使用類似'adrs.ToLookUp(k => k.userid)'的查找方式',然後通過用戶標識從查找中提取地址列表。 – ViRuSTriNiTy

回答

1

假設你保持用戶和地址List S代表某種原因,你可以在LINQ中使用一個join,它將結合兩個list s並在內部使用散列數據結構將它們放在一起:

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(); 

在我的測試更快的案例似乎取決於有多少用戶與地址匹配。

+0

刪除我的答案,因爲它與你的相同 – tinudu

相關問題