2009-07-31 31 views
6

Bất kỳ ai quan tâm đến việc chúng tôi có nên sử dụng "I" hoặc "II" và "&" hoặc "& &" trong LINQ Where() tiện ích mở rộng/truy vấn của chúng tôi không? Bất kỳ sự khác biệt với LINQ to SQL? Kết quả là cây biểu thức là nhiều hơn tôi có thể nhận được bộ não của tôi xung quanh trên một chiều thứ SáuLINQ Ở đâu() Ống đơn/đôi/Ampersands

Cảm ơn,

static void Main(string[] args) 
{ 
    var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    var q1 = numbers.Where(i => i == 1 | i == 2); 
    var q2 = numbers.Where(i => i == 1 || i == 2); 

    var q3 = numbers.Where(i => i == 1 & i < 3); 
    var q4 = numbers.Where(i => i == 1 && i < 3); 

    Write(q1); 
    Write(q2); 
    Write(q3); 
    Write(q4); 
} 

static void Write<T>(IEnumerable<T> t) 
{ 
    foreach (var i in t) 
     Console.Write("{0} ", i); 

    Console.WriteLine(); 
} 


Results: 

    1 2 
    1 2 
    1 
    1 

Trả lời

9

Bạn muốn ||/&&.

Vâng, đơn ống (|/&) thường được sử dụng cho số học bitwise, và (trong số các vấn đề khác) có thể làm cho cơ sở mã khó hiểu hơn; nó sẽ hoạt động trong LINQ-to-Objects (vì bitwise vẫn là được định nghĩa cho bool), nhưng không có mạch ngắn thông thường. Nhưng nếu nguồn dữ liệu của bạn là một cơ sở dữ liệu (tức là có một trình phân tích cú pháp biểu thức trong hỗn hợp), bạn có thể thấy nó phát nổ trên bạn.


OK; bitwise có thể đã gây hiểu nhầm; nhưng || và & & vẫn là cách hợp lý nhất và được mong đợi để thể hiện ý định của bạn. Lời xin lỗi của tôi cho bất kỳ sự nhầm lẫn nào.

+1

'|' không phải là bitwise đối với 'bool', nó không chỉ là ngắn mạch. Điều đó nói rằng, không SQL thậm chí đảm bảo rằng 'AND' và' OR' ngắn mạch có? Nếu không, thì tôi mong đợi '|' và '||' để dịch thành 'OR' trong mọi trường hợp. –

+0

Ok Pavel, Marc, đúng không? Khác với mã của người mà tôi đang xem xét, tôi chưa bao giờ thấy các phiên bản đơn lẻ được sử dụng. – andleer

+0

|/& không phải là "bitwise" chúng chỉ là bitwise cho các loại tích phân và bool. Chúng hợp lý cho mọi thứ khác. –

1

Tất cả đều giống nhau trong ví dụ của bạn. Các | toán tử bị quá tải cho kiểu bool và giống như ||

http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

Tôi thích sử dụng || bởi vì mọi người quen với nó và cảm thấy tự nhiên hơn đối với hầu hết các nhà phát triển.

+0

Nó không giống nhau - '|' trên boolean không phải là ngắn mạch (tức là nó luôn luôn đánh giá bên phải), trong khi '||' là. Câu hỏi đặt ra ở đây là liệu nó có quan trọng trong ngữ cảnh LINQ to SQL hay không. –

0

Nó thực sự tùy thuộc vào sở thích của bạn.

Nhìn chung, các nhà phát triển MOST gắn bó với || và & & cho tất cả các OR hợp lý và AND của đặc biệt là khi chúng đang xử lý một loạt các số trong mã của chúng, như bạn vậy. Điều này là do nó gây nhầm lẫn với các nhà phát triển khác.

Vì vậy, ý kiến ​​của tôi là để gắn bó với || và & & cho công việc hợp lý của bạn và chỉ sử dụng | và & cho các hoạt động bitwise của bạn.

Một lần nữa, mặc dù nó chỉ là tùy chọn.

4

Bất cứ ai quan tâm đến bình luận vào việc chúng ta nên sử dụng | hoặc ||& hoặc && trong LINQ của chúng tôi ở đâu() extensions/truy vấn?

Trong biểu thức lambda (chẳng hạn như các biểu thức thường được sử dụng trong LINQ), các toán tử này hoạt động như bình thường trong C#. |& là các toán tử logic trong khi ||&& là các toán tử logic ngắn mạch. Ngắn mạch là tốt nếu bạn muốn mã hiệu quả. Ngắn mạch là xấu nếu bạn muốn tránh mã phân nhánh (có lẽ với UnitTest có phạm vi phủ sóng 100%).Hầu hết mọi người sử dụng ngắn mạch tất cả các thời gian và phân nhánh không làm phiền họ bởi vì họ tránh sử dụng các biểu thức có tác dụng phụ, do đó họ không bị hậu quả xấu khi một số biểu thức không được đánh giá.

Dưới đây là một ví dụ về phân nhánh hữu ích bằng cách ngắn mạch:

if (DatabaseIsAvailable() && QueryDataAndThereAreResults()) 
{ 
    //do something with Results 
} 

Khi DatabaseIsAvailable() là sai, QueryDataAndThereAreResults() sẽ không được đánh giá.

Bất kỳ sự khác biệt nào với LINQ to SQL?

Không quan trọng bạn sử dụng Linq cho Sql. Dấu chấm câu sẽ được dịch sang các toán tử ANDOR của T-Sql. Sau khi truy vấn được gửi đến cơ sở dữ liệu, Trình tối ưu hóa kế hoạch truy vấn SqlServer sẽ tìm hiểu xem có ngắn mạch hay không.