У меня есть несколько элементов, каждый из которых имеет несколько связанных с ним кодов. Каждый элемент будет иметь их коллекцию.
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, но это кажется немного неуклюжим - но, возможно, это лучший вариант. В моей голове я представляю себе какую-то коллекцию веб-сети...
Учитывая, что производительность является моей конечной целью, существует ли более оптимальный подход?
Поэтому создайте 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) раз.
IDictionary<string, IList<ComplexObject>>
. С точки зрения производительности, для поиска они будут примерно эквивалентны.