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 № 1Wolał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.