Подтвердить что ты не робот

Среди Find, Single, First, какой из них самый быстрый?

Я хочу свести к минимуму время, необходимое для извлечения одного уникального элемента из списка. Какой из них является самым быстрым методом среди Find, Single и First? Обратите внимание, что ключ поиска является уникальным идентификатором.

4b9b3361

Ответ 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.