2012-03-24 6 views
26

I mają następujące Linq zapytanie:Jak radzić sobie z zerami w LINQ podczas korzystania z Min. Lub Maksimum?

result.Partials.Where(o => o.IsPositive).Min(o => o.Result) 

pojawia się wyjątek, kiedy result.Partials.Where (o => o.IsPositive) nie zawiera elementów. Czy istnieje elegancki sposób radzenia sobie z tym innym niż dzielenie operacji na dwie części i sprawdzanie zerowej wartości? Mam klasę pełną takich operacji.

EDYCJA: Pytanie jest związane z LINQ do obiektów.

To Wyjątek Dostaję (przekład mówi: Sekwencja jest pusta):

enter image description here

+0

Jakiego wyjątku otrzymujesz? Z mojego doświadczenia wynika, że ​​jeśli 'Partials' jest pusty, powinieneś otrzymać 0. –

+0

twój ślad stosu ma wywołanie' Min() 'not' Sum() '. Czym jest "wynik"? – Jon

+0

Przepraszamy. Mój zły, operacja to min. I maks. Nie suma. Jeszcze raz przepraszam. Edytowanie pytania. –

Odpowiedz

53

krótkie podsumowanie obliczenie Min

var min = result.Partials.Where(o => o.IsPositive).Min(o => o.Result); 

to twoja sprawa: jeśli nie istnieją żadne elementy dopasowane, a następnie wywołanie Min podniesie wyjątek (InvalidOperationException).

var min = result.Partials.Where(o => o.IsPositive) 
          .Select(o => o.Result) 
          .DefaultIfEmpty().Min(); 

DefaultIfEmpty stworzy wyliczanie nad elementu 0, gdy nie istnieją żadne elementy listy. Skąd wiadomo, że 0 oznacza Min lub 0 oznacza listę bez elementów?

var min = result.Partials.Where(o => o.IsPositive) 
          .Min(o => (decimal?)o.Result); 

Tutaj min jest albo zerowe (defaul(decimal?)) albo rzeczywiste znalezione min. Tak więc konsument tego wyniku będzie wiedział, że jeśli wynik jest zerowy, to lista nie ma elementów, a gdy wynik jest wartością dziesiętną, to lista ma pewne elementy, a Minimum tych elementów jest tą wartością.

Jednak, gdy nie ma to znaczenia, można zadzwonić pod numer min.GetValueOrDefault(0).

6

Nie można używać Min (lub Max) jeżeli sekwencja jest pusta. Jeśli to nie powinno się dziać, masz inny problem ze sposobem definiowania result. W przeciwnym razie, należy sprawdzić, czy sekwencja jest pusta i obsługiwać odpowiednio, np:

var query = result.Partials.Where(o => o.IsPositve); 
min = query.Any() ? query.Min(o => o.Result) : 0; // insert a different "default" value of your choice...  
+0

to spowoduje 2 zapytania. ale można to zrobić za pomocą jednego. – maxlego

8

Można użyć metody DefaultIfEmpty aby upewnić się, że kolekcja ma przynajmniej 1 przedmiot:

result.Partials.Where(o => o.IsPositive).Select(o => o.Result).DefaultIfEmpty().Min(); 
+0

.. co jeśli wartością domyślną jest null? –

+0

@RitchMelton: Wierzę, że min zwróci wartość null. –

+0

Jestem prawie pewien, że wywołanie 'o.Result' z elementem zerowym powoduje zgłoszenie wyjątku. –

Powiązane problemy