Универсальный список FindAll () по сравнению с foreach

Создайте переменную в своем классе ячейки и в ячейке для строки, просто присвойте это значение переменной и используйте в своем классе ячейки.

30
задан casperOne 29 July 2014 в 16:47
поделиться

7 ответов

Необходимо определенно использовать FindAll метод или эквивалентный метод LINQ. Кроме того, рассмотрите использование более краткой лямбды вместо своего делегата, если Вы можете (требовать C# 3.0):

var list = new List<string>();
var newList = list.FindAll(s => s.Equals("match"));
46
ответ дан Manek 27 November 2019 в 23:29
поделиться

Я использовал бы FindAll метод в этом случае, поскольку это более кратко, и IMO, имеет более легкую удобочитаемость.

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

Я должен подчеркнуть, насколько незначительный это различие, оно больше, чем, вероятно, никогда не будет иметь значение, если Вы не делаете крупное количество операций в крупном списке.

Как всегда, тест для наблюдения, где узкие места и действуют соответственно.

9
ответ дан casperOne 27 November 2019 в 23:29
поделиться

Jonathan,

Хороший ответ, который можно найти к этому, находится в главе 5 (соображения производительности) Linq К Действию.

Они имеют размеры для каждого поиска, который выполняется приблизительно 50 раз, и это придумывает foreach = 68 мс за цикл / Список. FindAll = 62 мс за цикл. Действительно, это, вероятно, было бы в Вашем интересе просто создать тест и лично убедиться.

5
ответ дан matt_dev 27 November 2019 в 23:29
поделиться

Список. FindAll является O (n) и будет искать весь список.

Если бы Вы хотите выполнить свой собственный итератор с foreach, я рекомендовал бы использовать оператор урожая и возвратить IEnumerable, если это возможно. Таким образом, если Вы заканчиваете тем только, что нуждались в одном элементе своего набора, это будет более быстро (так как можно остановить вызывающую сторону, не исчерпывая весь набор).

Иначе придерживайтесь интерфейса BCL.

4
ответ дан Reed Copsey 27 November 2019 в 23:29
поделиться

Любое различие в перфекте будет чрезвычайно незначительным. Я предложил бы FindAll для ясности, или, если это возможно, Счетный. Где. Я предпочитаю использовать Счетные методы, потому что это допускает большую гибкость в рефакторинге кода (Вы не берете на себя зависимость List<T>).

3
ответ дан Daniel Pratt 27 November 2019 в 23:29
поделиться

Да, они оба реализации являются O (n). Они должны посмотреть на каждый элемент в списке для нахождения всех соответствий. С точки зрения удобочитаемости я также предпочел бы FindAll. Для производительности соображения взглянули на LINQ в Действии (Ch 5.3). При использовании C# 3.0, Вы могли бы также применить лямбда-выражение. Но это - просто обледенение на пироге:

var newList = aList.FindAll(s => s == "match");
2
ответ дан olli-MSFT 27 November 2019 в 23:29
поделиться

Я с лямбдами

List<String> newList = list.FindAll(s => s.Equals("match"));
1
ответ дан MRFerocius 27 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: