/ / Czy konwersja jest możliwa? [zamknięte] - .net, linq

Konwertuje się w Gdzie złe? [zamknięty] - .net, linq

Biorąc pod uwagę następujące dwa przypadki, który z nich jest lepszy (jeśli oba są złe, zrobienie tego w zupełnie inny sposób jest również opcją)?

Convert.ToInt32 wezwany Where:

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

Convert.ToInt32 nazywany wcześniej Where:

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

Odpowiedzi:

2 dla odpowiedzi № 1

Wolałbym drugi. Dokonuje tylko jednej konwersji, zamiast wielu.

Ale jeśli nie jest to kluczowy dla wydajności fragment kodu (mało prawdopodobne; wygląda na to, że jest to kod GUI), nie zauważysz różnicy.


3 dla odpowiedzi № 2

Oba mają wadę -

Dzwonisz .Where(...) w kolekcji, ale nie robiąc nic z wynikami. Nie będzie to miało żadnego wpływu, ponieważ Where nie zmienia oryginalnej kolekcji - zwraca nową IEnumerable<T> elementów pasujących do predykatu.

Biorąc to pod uwagę, wolałbym drugą opcję - w pierwszej opcji - Convert.ToInt32 wywołanie będzie uruchamiane raz dla każdego elementu w Twojej kolekcji. W małej kolekcji może to nie mieć znaczenia, ale gdy kolekcja będzie się powiększać, będzie wolniejsza.

Możesz zauważyć różnicę w tymsytuacja, ale dobrą praktyką jest deklarowanie zmiennych przed użyciem instrukcji LINQ. Często widzę sytuacje, w których ludzie zakładają, że LINQ jest powolny tylko dlatego, że wykonują kosztowne obliczenia w ramach swoich predykatów. W tym przypadku twoja metoda jest stosunkowo szybka, więc prawdopodobnie nie będzie to miało znaczenia, ale w praktyce dobrym nawykiem jest przestrzeganie drugiego wzorca.


2 dla odpowiedzi nr 3

Jedyną różnicą, jaką widzę, jest sposób kompilatorawygeneruje lambda. W drugiej wersji wartość jest przechwytywana i nie jest przywoływana, co będzie miało wpływ na środowisko wielowątkowe.