2012-11-21 11 views
18

Mam IEnumberable kolekcję przedmiotów. Używam .Single(), aby znaleźć określony obiekt w kolekcji.LINQ pojedynczy() Wyjątek dla 0 lub wielu elementów

wybiorę używać Single() dlatego nie powinno być tylko jeden konkretny przedmiot. Jeśli jednak nie istnieje, muszę go utworzyć i dodać do kolekcji.

Moim problemem jest to, że Single() rzuca ten sam błąd, jeśli nie ma elementu pasującego predykat lub jeśli istnieje wiele elementów. Mój pomysł polegał na tym, aby przetestować połączenie Single() i wychwycić wyjątek, dodać element, a następnie kontynuować. Ponieważ jednak oba scenariusze rzucają InvalidOperationException, jak mogę stwierdzić, czy jest to spowodowane brakiem elementów lub wieloma elementami?

Wiem, że mogę używać First(), ale to nie oznacza, że ​​powinien istnieć tylko jeden (bez wykonywania dodatkowej pracy).

mogę również użyć Count() przed wywołaniem Single(), ale to po prostu wydaje się podważać sensu Single()

Odpowiedz

32

Co chcesz jest SingleOrDefault()

W „lub default” w rzeczywistości oznacza to zwraca null (dla porównania typy) lub cokolwiek domyślne byłoby dla typu niereferencyjnego. Musisz zastąpić obiekt, aby zajął jego miejsce.

+5

Cóż, to zwraca wartość domyślną dla danego typu elementu. Jest to wartość pusta dla typów referencyjnych, ale oczywiście nie dla typów wartości nienależących do wartości zerowej ... –

+1

... a jeśli chcesz łączyć sprawdzanie wartości NULL, możesz użyć czegoś takiego http://napoleonss.wordpress.com/2011/12/ 20/my-check-null /. Działa domyślnie dla typów – napoleonss

+0

@JonSkeet Masz rację. Zakładałem, że mówił o typie referencyjnym. –

4

Nie polecam korzystania z try/catch w tym scenariuszu, ponieważ stosując wyjątki do podejmowania decyzji logicznych zasobów jest kosztowne.

polecam korzystania SingleOrDefault() i sprawdzić, czy wynik jest zerowy. Jeśli to jest. Wykonaj swoje dzieło.

+4

"Zasoby drogie" - jest nieco przestarzały/nieprawidłowy widok. Zobacz link Rico Mariani tutaj. http://stackoverflow.com/q/891217/16391. Zgadzam się, że używanie wyjątków do podejmowania decyzji logicznych jest złym wyborem. – StingyJack

Powiązane problemy