З огляду на наступні два випадки, який із них є кращим (якщо вони обидва погані, це теж зовсім інший варіант)?
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
Єдина відмінність, яку я бачу, - це як компіляторпороджував лямбда. У другій версії значення фіксується і не посилається, і це матиме ефект у багатопотоковому середовищі.