2013-10-03 5 views
9

Podczas wysyłania zapytania do listy liczb dodatnich za pomocą SingleOrDefault(), w jaki sposób mogę zwrócić wartość null, lub niestandardową wartość, np. -1, gdy numer nie znajduje się na liście, zamiast wartości domyślnej typu (w tym przypadku 0)?Jak zwrócić wartość null, jeśli używamy SingleOrDefault() i szukamy listy liczb dla numeru, którego nie ma na liście?

+0

nie można zmienić zachowanie SingleOrDefault będzie alwyays powrócić domyślnego obiektu, w przypadku wystąpienia int, 0, w przypadku int? -> null. Wykonaj jedno z poniższych podejść, aby je obejść;) – MichaC

+0

@Ela Rozumiem to. Celem mojego pytania było obejście tego. –

Odpowiedz

0

Należy zmienić typ na liście na int? (dopuszczalna wartość n). Domyślna wartość, którą zwrócisz, będzie równa 0 dla liczby całkowitej. Dla typów referencyjnych będzie to zero. Bez przeciążenia metody nie można ustawić domyślnej wartości wycofania jako wartości custome.

+0

To prawda; możesz zmodyfikować zapytanie jako całość (w dość prosty sposób), aby osiągnąć ten cel. To ogólnie nie jest problem niemożliwy. – Servy

7

Można użyć:

var first = theIntegers 
       .Cast<int?>() 
       .SingleOrDefault(i => i == theValue) ?? valueIfNotFound; 

To działa poprzez odlewanie elementów do Nullable<int>, a następnie za pomocą null-coalescing operator aby zwrócić wartość wybrać, czy null został zwrócony (czyli: nie stwierdzono).

Uwaga: zostanie to rzucone, jeśli masz więcej pasujących elementów. Jeśli nie chcesz tego zachowania, użyj FirstOrDefault zamiast SingleOrDefault.

+0

@Servy Zakładam, że OP nie omyłkowo używa tego zamiast "FirstOrDefault", że były już pewne błędne odpowiedzi dotyczące wyboru metody. – evanmcdonnal

+0

@evanmcdonnal Mój komentarz był bezpośredni w Reed, który powiedział, że 'SingleOrDefault' zwróci wartość domyślną w przypadku 2 pozycji na liście; od tego czasu zredagował swoją odpowiedź. Zakładam, że OP wiedział, co robi, kiedy zdecyduje się użyć "Single". – Servy

+0

@Servy Tak, naprawiałem to - pomieszane podczas pisania;) (teraz poprawione) –

11

Można użyć DefaultIfEmpty określić wartość zwyczaj domyślną dla pustego zbioru:

var value = numbers.Where(MyFilter) 
    .DefaultIfEmpty(-1) //or any other default value you want 
    .Single(); //OrDefault not needed; DefaultIfEmpty ensures there is an item 
+0

Niekoniecznie * dowolna * inna wartość. Na przykład, ** null **, rzuci wyjątek. –

+0

@TravisJ Dowolna wartość tego typu. Nie można określić wartości innego typu całkowicie, to jest poprawne. Aha, a jeśli wartość, jeśli nie jest właściwego typu, nie rzuci wyjątku; zamiast tego * nie będzie kompilować *. – Servy

0

Może twoja sprawa jest uproszczona tak to nie ma zastosowania, ale jeśli tylko szukasz numeru, który już znamy i chce wrócić dowolną liczbę, jeśli nie jest na liście, można użyć metody Any-extension:

int numberToLookFor = 42; 
int arbitraryReturnOnNotFound = 17; 

int result = numbers.Any(n => n == numberToLookFor) ? numberToLookFor : arbitraryReturnIfNotFound; 
Powiązane problemy