Эффективная фильтрация больших наборов многоключевых объектов

1

У меня есть несколько элементов, каждый из которых имеет несколько связанных с ним кодов. Каждый элемент будет иметь их коллекцию.

List<ComplexObject> myCollection = new List<ComplexObject>();
var item = new ComplexObject() 
           { 
               Id = 5, 
               Codes = new List<string>() { "1", "4", "5" } 
           }; 
myCollection.Add(item);

Мне нужно отфильтровать эти объекты по коду, по требованию. Будет много записей, возможно,> 1,000,000, каждый из которых содержит набор связанных ключей.

Я, очевидно, могу использовать что-то вроде:

var output = (from p in myCollection
             from q in p.Codes
             where q == x
             select p).ToList();

Но, я хочу, чтобы иметь возможность фильтровать по коду без необходимости перебирать все объекты - вот что происходит здесь. Производительность критически важна в этом контексте, поэтому я хочу достичь лучшего времени поиска (O) для этих объектов.

Я подумал о создании словаря, в котором каждый код является ключом, и коллекции ComplexObjectIds, но это кажется немного неуклюжим - но, возможно, это лучший вариант. В моей голове я представляю себе какую-то коллекцию веб-сети...

Учитывая, что производительность является моей конечной целью, существует ли более оптимальный подход?

Теги:

1 ответ

1
Лучший ответ

Поэтому создайте ILookup используя .ToLookup расширения .ToLookup:

var lookup = myCollection
  .SelectMany(co => co.Codes.Select(code => new{code, co}))
  .ToLookup(x => x.code, x => x.co);

поэтому теперь вы можете запросить поиск

IEnumerable<ComplexObject> complexObjs = lookup["1"];  

в O (1) раз.

  • 0
    Замечательно. При добавлении новых записей этот вызов нужно будет обновить, правильно?
  • 0
    В самом деле ... если это живая коллекция, вам лучше использовать IDictionary<string, IList<ComplexObject>> . С точки зрения производительности, для поиска они будут примерно эквивалентны.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню