Я хочу свести к минимуму время, необходимое для извлечения одного уникального элемента из списка.
Какой из них является самым быстрым методом среди 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.