Метод расширения 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.

Однако вы должны понимать, что на самом деле невозможно использовать эффективный поиск ключа в словаре (отсортированный или иным образом) для выполнения этого конкретного типа запроса, потому что эффективный поиск ключа разрешит одну запись. Это связано с тем, что дублирующиеся ключи не допускаются в структуре данных, поэтому для данного ключа, который можно использовать для быстрого поиска, вы всегда разрешите только одно результирующее значение, а не последовательность.

Поэтому сценарий на самом деле не имеет смысла.

Другие вопросы по тегам