для оптимизации - PullRequest
       11

для оптимизации

2 голосов
/ 18 марта 2012

Я пытаюсь оптимизировать этот код:

   foreach (string id in ids)
   {
     MyClass x = myDictionary[id];
     foreach (var map in Maps)
     {
       if ( x.id == map.SourceId || x.id == map.DestionationId)
       {
           //add id to a hashset
       }
     }
   }

, если ids.count равен 1600, а Maps.Count равен 300 000, занимает около 10 минут.

i 'Мы пробовали LINQ, но результаты не намного лучше:

   var allIds = Maps.select(map => map.SourceId).Union(Maps.select(map => map.DestinationID)).Distinct();
   var toAdd = from id in Ids
               join mapId in AllIds on id equals mapid
               select id;
  //create hashset based on  toAdd collection.

Может кто-нибудь указать мне на лучшее решение и, если возможно, объяснить, почему linq в этом случае не намного быстрее?

Спасибо

1 Ответ

5 голосов
/ 18 марта 2012

У вас есть сложность O (countIds * countMaps), если вы поместите все Карты в 2 словаря, проиндексированных по источнику и месту назначения, вы получите O (countIds + countMaps).

...