2013-10-03 13 views
9

Khi truy vấn danh sách số dương bằng cách sử dụng SingleOrDefault(), làm cách nào tôi có thể trả lại giá trị rỗng hoặc giá trị tùy chỉnh như -1, khi không tìm thấy số trong danh sách, thay vì giá trị mặc định của loại (0 trong trường hợp này)?Làm thế nào để trả về null nếu sử dụng SingleOrDefault() và tìm kiếm một danh sách các số cho một số không có trong danh sách?

+0

bạn không thể thay đổi hành vi của SingleOrDefault, nó sẽ trả về mặc định đối tượng, trong trường hợp int, 0, trong trường hợp int? -> null. Hãy thực hiện một trong các cách tiếp cận được đăng bên dưới để giải quyết vấn đề đó;) – MichaC

+0

@Ela Tôi hiểu điều đó. Mục đích của câu hỏi của tôi là để có được xung quanh đó. –

Trả lời

0

Bạn phải thay đổi loại trong danh sách của mình thành int? (một int vô giá trị). Giá trị mặc định mà bạn trả lại sẽ bằng 0 cho một số nguyên. Đối với các loại tham chiếu, nó sẽ là null. Nếu không có quá tải phương thức bạn không thể làm cho giá trị retrurn mặc định là một giá trị theo yêu cầu.

+0

Trong khi đó là sự thật; bạn có thể sửa đổi toàn bộ truy vấn (theo những cách khá đơn giản) để hoàn thành mục tiêu đó. Nó không phải là một vấn đề không thể nói chung. – Servy

7

Bạn có thể sử dụng:

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

này hoạt động bằng cách đúc các mục cần một Nullable<int>, sau đó sử dụng null-coalescing operator để trả lại giá trị mà bạn chọn nếu null được trả lại (ví dụ: không tìm thấy).

Lưu ý điều này sẽ ném nếu bạn có nhiều mục phù hợp. Nếu bạn không muốn hành vi đó, hãy sử dụng FirstOrDefault thay vì SingleOrDefault.

+0

@Servy Tôi giả sử OP không nhầm lẫn bằng cách sử dụng thay vì 'FirstOrDefault' đã có một số câu trả lời sai lầm giải quyết sự lựa chọn phương pháp. – evanmcdonnal

+0

@evanmcdonnal Nhận xét của tôi là trực tiếp tại Reed, người đã nói rằng 'SingleOrDefault' sẽ trả lại giá trị mặc định trong trường hợp 2 mục nằm trong danh sách; anh ấy đã chỉnh sửa câu trả lời của mình. Tôi cho rằng OP biết anh ta đang làm gì khi anh ta chọn sử dụng 'Single'. – Servy

+0

@Servy Vâng, tôi đã sửa chữa thực sự - đã sai lầm khi viết nó;) (sửa ngay) –

11

Bạn có thể sử dụng DefaultIfEmpty để xác định một giá trị mặc định tùy chỉnh cho một bộ sưu tập trống:

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

Không nhất thiết phải * bất kỳ * giá trị nào khác. Ví dụ, ** null **, sẽ ném một ngoại lệ. –

+0

@TravisJ Bất kỳ giá trị nào thuộc loại đó. Bạn không thể chỉ định giá trị của một số loại hoàn toàn khác, điều đó là chính xác. Oh, và nếu giá trị nếu không thuộc loại thích hợp, nó sẽ không ném một ngoại lệ; thay vào đó nó sẽ không biên dịch *. – Servy

0

Có lẽ câu hỏi của bạn trở nên đơn giản vì vậy đây không áp dụng, nhưng nếu bạn chỉ tìm kiếm một số bạn đã biết và muốn trả lại một số tùy ý nếu nó không có trong danh sách, bạn có thể sử dụng phương thức Bất kỳ mở rộng:

int numberToLookFor = 42; 
int arbitraryReturnOnNotFound = 17; 

int result = numbers.Any(n => n == numberToLookFor) ? numberToLookFor : arbitraryReturnIfNotFound; 
Các vấn đề liên quan