/ / Чи перетворення в де погано? [закритий] - .net, linq

Конвертувати в де погано? [закрито] - .net, linq

З огляду на наступні два випадки, який із них є кращим (якщо вони обидва погані, це теж зовсім інший варіант)?

Convert.ToInt32 викликається Where:

 var items = GetItems();
if (aDropDownList.SelectedIndex > 0)
{
items = items.Where(x =>
x.IntProperty == Convert.ToInt32(aDropDownList.SelectedValue));
}

Convert.ToInt32 зателефонував раніше Where:

var items = GetItems();
if (aDropDownList.SelectedIndex > 0)
{
int selectedDropDownValue = Convert.ToInt32(aDropDownList.SelectedValue);
items = items.Where(x => x.IntProperty == selectedDropDownValue);
}

Відповіді:

2 для відповіді № 1

Я віддав би перевагу другому. Він робить лише одне перетворення замість багатьох.

Але якщо це не критичний для продуктивності фрагмент коду (малоймовірно; це здається, що код GUI), ви не помітите різниці.


3 для відповіді № 2

Обоє мають ваду -

Ви дзвоните .Where(...) на колекцію, але нічого не роблячи з результатами. Це не матиме жодного ефекту, оскільки Де не змінює оригінальну колекцію - вона повертає нову IEnumerable<T> елементів, що відповідають присудкові.

Це, як було сказано, я вважаю за краще другий варіант - У першому варіанті Convert.ToInt32 виклик буде здійснено один раз для кожного елемента вашої колекції. У невеликій колекції це може не мати значення, але в міру збільшення колекції воно буде повільніше.

Ви можете або не помітите цієї різниці в цьомуситуація, але "IMO" є хорошою практикою оголошувати свої змінні перед використанням оператора LINQ. Я часто бачу ситуації, коли люди припускають, що LINQ повільний лише тому, що вони роблять дорогі обчислення в межах своїх предикатів. У цьому випадку ваш метод відносно швидкий, тому, ймовірно, це не матиме значення, але як практика, це корисна звичка слідувати другій схемі.


2 для відповіді № 3

Єдина відмінність, яку я бачу, - це як компіляторпороджував лямбда. У другій версії значення фіксується і не посилається, і це матиме ефект у багатопотоковому середовищі.