2012-07-19 15 views
6

Quiero convertir este código a una solución linq. Lo que hace se ve en una colección de clientes y ver si al menos uno de los tiene un segundo nombre. Este código funciona bien, sólo estoy tratando de aprender LINQ, así que buscando una solución alternativa .:Primera coincidencia en una colección

//Customers - List<Customer> 
private bool checkMiddleName() 
{ 
    foreach (Customer i in Customers) 
    { 
     if (i.HasMiddleName == true) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

traté de escribir algo como: (Customers.Foreach(x=>x.HasMiddleName==true)... pero se ve la línea no es el método que estoy buscando .

+0

FYI - el método ParaCada en la lista simplemente ejecuta la función dada en cada miembro de la lista – cordialgerm

Respuesta

18

Si lo que desea saber si tener al menos una, puede utilizar Enumerable.Any:

bool atLeastOneCustomerWithMiddleName = Customers.Any(c => c.HasMiddleName); 

Si quieres saber la primera pareja cus Tomer, puede utilizar Enumerable.First o Enumerable.FirstOrDefault para encontrar el primer cliente con MiddleName==true:

var customer = Customers.FirstOrDefault(c => c.HasMiddleName); 
if(customer != null) 
{ 
    // there is at least one customer with HasMiddleName == true 
} 

First lanza un InvalidOperationException si la secuencia de origen está vacío, mientras que los rendimientos FirstOrDefaultnull si no hay coincidencia.

+0

¿Hay alguna manera de devolver verdadero o falso de la consulta? – user194076

+0

@ user194076: puede usar 'Any' si desea verificar si hay un cliente que coincida con el anterior. Editado mi respuesta. –

1

Basado en esto:

Lo que hace que se ve en una colección de clientes y ver si al menos uno de los tiene un segundo nombre.

Trate

return Customers.Where(x => x.HasMiddleName).Any(); 

Este retorno consulta true si al menos uno custmer tiene la propiedad HasMiddleName = true

+1

Niza - Cualquier es lo que estaba buscando. ¡Gracias! – user194076

+6

'Any' toma un predicado, por lo que puede acortar esto para' devolver Customers.Any (x => x.HasMiddleName); ' –

2
var result = Customers.Where(x=>x.HasMiddleName == true).FirstOrDefault(); 
0

Usted puede usar lo siguiente para lograr lo que se necesita:

Customers.Where(cust=> cust.HasMiddleName).Count > 0 

Por lo tanto, si el recuento es mayor que cero significa que tiene algunos clientes que tienen nombre.

O para un mejor rendimiento que puede decir:

bool customerWithMiddleName; 

foreach(Customer cust in Customers) 
{ 
    if(cust.HasMiddleName) 
    { 
    customerWithMiddleName = true; 
    break; 
    } 
} 
+1

No es una buena idea ya que ejecuta toda la consulta, solo para saber si hay un elemento coincidente. Considere que los clientes contienen 1000000 clientes y el primero tiene un segundo nombre. 'Any (cust => cust.HasMiddleName)' devolvería 'true' inmediatamente mientras que su enfoque verificaría todos y cada uno de los elementos antes de que regresen. –

+2

Esto requiere que el código cuente cuántos elementos correctos hay, en lugar de cortocircuitar la primera vez que se encuentra una coincidencia. Podría ser innecesariamente costoso. Es mejor usar. Cualquier(). – StriplingWarrior

Cuestiones relacionadas