Метод расширения LINQ Где оптимизирован для SortedDictionary?
Folks,
Если я вызываю метод расширения LINQ Where, использует ли он преимущества сортировки в SortedDictionary или пересекает каждый KVP и выполняет сравнение? Есть ли преимущество использования SortedDictionary для сценария поиска по критериям?
Спасибо!
4 ответа
Нет, хотя методы LINQ пытаются выполнить несколько базовых приведений (т. Е. К ICollection, когда требуется оценка длины), они не могут начать приводить IEnumerable к каждой коллекции.net, чтобы посмотреть, могут ли они использовать свойства этой коллекции.
Однако, поскольку вы знаете свойства вашего источника SortedDictionary, можете ли вы использовать TakeWhile или SkipWhile вместо Where?
Насколько я могу судить из изучения исходного кода (через Reflector), никакой специальной обработки для SortedDictionary<TKey, TValue>
,
Это полностью зависит от поведения реализации перечислителя SortedDictionary. Используйте Reflector там, чтобы увидеть, какое поведение проявляет перечислитель.
Нет, запрос Linq будет перечислять коллекцию как последовательность объектов KeyValuePair и применять предикат к каждому из них. Следовательно, вы не получите преимущества быстрого поиска, предоставляемого в этом случае SortedDictionary.
Однако вы должны понимать, что на самом деле невозможно использовать эффективный поиск ключа в словаре (отсортированный или иным образом) для выполнения этого конкретного типа запроса, потому что эффективный поиск ключа разрешит одну запись. Это связано с тем, что дублирующиеся ключи не допускаются в структуре данных, поэтому для данного ключа, который можно использовать для быстрого поиска, вы всегда разрешите только одно результирующее значение, а не последовательность.
Поэтому сценарий на самом деле не имеет смысла.