Метод расширения LINQ Где оптимизирован для SortedDictionary? - PullRequest
2 голосов
/ 10 ноября 2010

Люди,

Если я вызываю метод расширения LINQ Where, использует ли он преимущества сортировки в SortedDictionary или пересекает каждый KVP и выполняет сравнение? Есть ли преимущество использования SortedDictionary для сценария поиска по критериям?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 10 ноября 2010

Нет, хотя методы LINQ пытаются выполнить несколько основных приведений (т. Е. К ICollection, когда требуется оценка длины), они не могут начать приводить IEnumerable к каждой коллекции .net, чтобы посмотреть, могут ли они использовать свойства этой коллекции.

Однако, поскольку вы знаете свойства вашего источника SortedDictionary, можете ли вы использовать TakeWhile или SkipWhile вместо Where?

3 голосов
/ 10 ноября 2010

Насколько я могу судить из изучения исходного кода (через Reflector), для SortedDictionary<TKey, TValue>.

не выполняется никакой специальной обработки.
0 голосов
/ 10 ноября 2010

Нет, запрос Linq будет перечислять коллекцию как последовательность объектов KeyValuePair и применять предикат к каждому.Следовательно, вы не получите преимущества быстрого поиска, который обеспечивает SortedDictionary в этом случае.

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

Таким образом, сценарийна самом деле не имеет смысла.

0 голосов
/ 10 ноября 2010

Это полностью зависит от поведения реализации перечислителя SortedDictionary. Используйте Reflector там, чтобы увидеть, какое поведение проявляет перечислитель.

...