Я хочу свести к минимуму время, необходимое для извлечения одного уникального элемента из списка.
Какой из них является самым быстрым методом среди Find
, Single
и First
?
Обратите внимание, что ключ поиска является уникальным идентификатором.
Среди Find, Single, First, какой из них самый быстрый?
Ответ 1
Самый быстрый (для большого набора) должен был бы быть привязан к Dictionary<TKey,TValue>
и использовать его.
Single
и First
делать разные вещи; Single
всегда выполняет итерацию всего набора, даже если он находит его в начале списка, поэтому First
обычно будет быстрее, чем Single
, так как это короткое замыкание.
Ответ 2
First
будет быстрее, чем Single
, так как он может завершиться, как только он найдет совпадение. С другой стороны, это означает, что он не подтверждает, что только один элемент соответствует предикату.
Find
должен быть таким же быстрым, как First
, но менее переносимым, поскольку он будет работать только в списках. Если вы используете LINQ в целом, я постараюсь придерживаться операторов LINQ, если не будет определенной выгоды в использовании альтернативы.
Как говорит Марк, если вы собираетесь делать это регулярно, вы должны использовать Dictionary<,>
. Вы можете использовать оператор ToDictionary
, чтобы сделать это легко:
var dictionary = list.ToDictionary(x => x.Id);
// Now you can look up by ID really quickly
Очевидно, что для создания словаря требуется некоторое время, поэтому вы хотите сделать это только в том случае, если вы много раз выполняете поиск.
Ответ 3
Это разные методы.
Find
определяется в List<T>
, он почти такой же, как First
, который определен в Enumerable.cs
как метод расширения на IEnumerable<T>
. Оба из них вернутся, если обнаружен условный элемент (нет необходимости перебирать всю коллекцию), поэтому они имеют небольшую разницу в производительности.
В то время как Single
возвращает элемент, указанный в условном выражении, а также гарантирует, что этот элемент является единственным, удовлетворяющим условию. Таким образом, в большинстве случаев Single
работает медленнее, чем First
/Find
, потому что ему нужно перебирать коллекцию.
Ответ 4
В дополнение к существующим ответам: List.Find намного быстрее IEnumerable. Во-первых, потому что первый из них может работать с внутренним массивом List. Последний должен пройти через интерфейс IList.