2013-08-12 37 views
28

làm cách nào tôi có thể kiểm tra xem liệu đối tượng được trả về bởi hàm linq FirstorDefault có thực sự là mặc định không?linq Kiểm tra trước tiên cho giá trị mặc định

Ví dụ

Contact contact = dbo.contact 
        .where(m=>m.contactName == "Stackoverflow") 
        .FirstOrDefault() 

là có một cách khác để kiểm tra xem các tiếp xúc trên là giá trị mặc định thay vì sử dụng:

if(!contact.contactName.equal("Stackoverflow")) 
      do something 

Trả lời

44

Bạn sẽ không cần phải thực hiện điều đó bằng séc vì bạn truy vấn chỉ trả về các đối tượng trong đó contantName là Stackoverflow. Khi bạn sử dụng FirstOrDefault nó trả null nếu không có đối tượng đã được tìm thấy, do đó bạn có thể làm

if(contact == null) 
    do something 

Bạn biết đó là một loại tài liệu tham khảo nếu Liên là một lớp học vì vậy nó có giá trị mặc định sẽ là null. Tuy nhiên, bạn có thể kiểm tra đó là loại mặc định của bất kỳ đối tượng nào (tham chiếu hoặc giá trị) bằng cách sử dụng default.

if(contact == default(Contact)) 
    do something 

Như đã đề cập trong các ý kiến, bạn có thể có thể làm cho mã của bạn hiệu quả hơn bằng cách sử dụng sự quá tải của FirstOrDefault mà phải mất một vị ngữ.

FirstOrDefault(m => m.contactName == "Stackoverflow") 

Bạn cũng có thể thay đổi giá trị mặc định trả lại nếu chương trình của bạn cần phải làm việc với một cái gì đó khác hơn là một null hoặc 0. Ví dụ

Contact defaultContact = new Contact(); 
defaultContact.ContactName = "StackExchange"; 

Contact contact = dbo.contact.Where(m=>m.contactName == "Stackoverflow") 
          .DefaultIfEmpty(defaultContact).First(); 

trên sẽ trả lại đối tượng defaultContact nếu không có đối tượng khác đã được tìm thấy (thay vì trả lại null). Nếu bạn làm điều này thì bạn không cần phải kiểm tra null hoặc default(T) vì bạn biết bạn có đối tượng Contact.

+1

Một lưu ý nữa - nó tốt hơn để sử dụng 'FirstOrDefault (m => m.contactName == "Stackoverflow")' –

+1

+1, bổ sung để trả lời :) – keyboardP

+1

Điều này chỉ hoạt động nếu 'contact' là kiểu tham chiếu, sử dụng' default() 'là tốt hơn. –

7

FirstOrDefault sẽ trả lại null cho loại tham chiếu và default cho các loại giá trị. Vì vậy, kiểm tra của bạn không hợp lệ. Trong tin tức khác để kiểm tra wheteher giá trị là mặc định, bạn nên so sánh nó với default (Type):

Contact contact = dbo.contact.FirstOrDefault(m => m.contactName == "Stackoverflow"); 

if (!object.Equals(contact, default (Contact))) 
    // Is not default 

Đoạn mã trên sẽ làm việc với một trong hai struct Contact hoặc class Contact. Chúng tôi cũng giả định rằng default (Contact) không bao giờ là giá trị trả lại hợp lệ của truy vấn của chúng tôi.

+0

Bạn nên cung cấp một số mã ví dụ, đây sẽ là kiểm tra tốt nhất. –

1

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

Contact contact = dbo.contact.where(m=>m.contactName!="" &&m.contactName!=null && m.contactName == "Stackoverflow").FirstOrDefault(); 
2

FirstOrDefault() là viết tắt của phần tử đầu tiên, nếu không tìm thấy thì "mặc định" giá trị của loại đó. Nó sử dụng nội bộ từ khóa default để trả lại giá trị mặc định.

sử dụng: return default(Contact) or default(int)

cho ví dụ nếu đó là loại giá trị, hãy giả sử int thì nó sẽ trả về 0. Trong trường hợp loại tham chiếu, nó sẽ trả lại "Null", v.v.

Hy vọng điều này có ý nghĩa với bạn.

1

Nói chung, FirstOrDefault trả về mục bạn đã yêu cầu là default giá trị cho loại bộ sưu tập. Trong trường hợp tài liệu tham khảo đó là null, trong trường hợp của int - 0, vv

Các vấn đề liên quan