2009-07-31 14 views
6
cuidado

Cualquier persona a comentar sobre si debemos utilizar "I" o "II" y "&" o "& &" en nuestra LINQ) Donde (extensiones/consultas? ¿Alguna diferencia con LINQ to SQL? El árbol de expresión resultante es más de lo que puedo conseguir mi cerebro alrededor de viernes por la tardeLINQ where() Tubos individuales o dobles/Ampersands

Gracias,

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 

Respuesta

9

¿Quieres ||/&&.

Bueno, el single-pipe (|/&) se usa generalmente para la aritmética de bit a bit, y (entre otros problemas) puede hacer que la base del código sea más difícil de entender; va a trabajar en LINQ-to-Objects (ya que bit a bit sigue siendo definido para bool), pero sin el habitual cortocircuito. Pero si su fuente de datos es una base de datos (es decir, hay un analizador de expresiones en la mezcla), puede descubrir que explota en usted.


Aceptar; bitwise puede haber sido engañoso; pero || y & & sigue siendo la forma más lógica y esperada de expresar su intención. Mis disculpas por cualquier confusión.

+1

'|' no es bitwise para 'bool's, simplemente no está en cortocircuito. Dicho esto, ¿SQL incluso garantiza ese cortocircuito 'Y' y 'O' allí? Si no lo hace, entonces esperaría que '|' y '||' se tradujeran a 'OR 'en cualquier caso. –

+0

Ok Pavel, Marc, ¿qué es? Además del código del chico que estoy revisando, nunca he visto versiones únicas de ninguno de los utilizados. – andleer

+0

|/& no son "bitwise", solo son bitwise para tipos integrales y bool. Son lógicos para todo lo demás. –

1

Todo es lo mismo en su ejemplo. El | el operador está sobrecargado para el tipo bool y es lo mismo que ||

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

Yo prefiero usar || porque la gente está acostumbrada y se siente más natural para la mayoría de los desarrolladores.

+0

No es lo mismo - '|' en booleanos no es un cortocircuito (es decir, siempre evalúa el lado derecho), mientras que '||' sí lo es. La pregunta aquí es si importa en el contexto LINQ to SQL. –

0

Realmente depende de su preferencia.

En general, los desarrolladores de MOST se adhieren a || y & & para todos los OR lógicos y AND's especialmente cuando se trata de un grupo de números en su código, como usted. Esto se debe a que es visualmente confuso para otros desarrolladores.

Por lo tanto, mi opinión es atenerse a || y & & para su trabajo lógico y uso exclusivo | y & para sus operaciones bit a bit.

De nuevo, aunque es solo una preferencia.

4

A alguien le importa hacer comentarios sobre si debemos utilizar | o || y & o && en nuestra LINQ) Donde (extensiones/consultas?

En expresiones lambda (como las que se utilizan con frecuencia en Linq), estos operadores actúan como lo hacen normalmente en C#. | y & son operadores lógicos, mientras que || y && son operadores lógicos en cortocircuito. El cortocircuito es bueno si quiere un código eficiente. El cortocircuito es malo si desea evitar código de bifurcación (quizás a UnitTest con 100% de cobertura).La mayoría de las personas usa el cortocircuito todo el tiempo y la ramificación no les molesta porque evitan el uso de expresiones que tienen efectos secundarios, por lo que no sufren consecuencias negativas cuando algunas de las expresiones no se evalúan.

Aquí está un ejemplo de ramificación útil por cortocircuito:

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

Cuando DatabaseIsAvailable() es falsa, no se evaluarán QueryDataAndThereAreResults().

¿Alguna diferencia con LINQ to SQL?

No importa cuál use para Linq a Sql. La puntuación se traducirá a los operadores de T-Sql AND y OR. Después de que la consulta se envía a la base de datos, el Optimizador de planes de consultas SqlServer determinará si se produce un cortocircuito o no.

Cuestiones relacionadas