2012-07-19 15 views
6

Chcę przekonwertować ten kod na rozwiązanie linq. To, co robi, spogląda na kolekcję klientów i sprawdza, czy przynajmniej jedno z nich ma drugie imię. Ten kod działa poprawnie, ja tylko próbuje dowiedzieć się LINQ, więc szuka alternatywnego rozwiązania .:Pierwszy mecz w kolekcji

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

starałem się napisać coś takiego: (Customers.Foreach(x=>x.HasMiddleName==true)... ale wygląda linia nie jest to metoda szukam .

+0

FYI - metoda ForEach na liście tylko wykonuje daną funkcję na każdego członka listy – cordialgerm

Odpowiedz

18

Jeśli chcesz tylko wiedzieć, czy tam co najmniej jeden, można użyć Enumerable.Any:

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

Jeśli chcesz poznać pierwszą pasującą cus Tomer, można użyć Enumerable.First lub Enumerable.FirstOrDefault znaleźć pierwszego klienta z MiddleName==true:

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

First rzuca InvalidOperationException jeżeli sekwencja źródłem jest pusta, natomiast FirstOrDefault zwrotów null jeśli nie ma odpowiednika.

+0

Jakikolwiek sposób zwrócić wartość true lub false z zapytania? – user194076

+0

@ user194076: Możesz użyć opcji "Dowolny", jeśli chcesz sprawdzić, czy w sklepie znajduje się jeden pasujący klient. Zmieniono moją odpowiedź. –

1

Na tej podstawie:

Co robi wygląda na zbiór klientów i zobacz, jeśli przynajmniej jeden z ma drugie imię.

Spróbuj

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

Ten powrót zapytanie true jeśli przynajmniej jeden custmer ma właściwość HasMiddleName = true

+1

Nicea - każdy z nich jest to, czego szukasz. Dzięki! – user194076

+6

'Any' pobiera predykat, więc możesz go skrócić do' return Customers.Any (x => x.HasMiddleName); ' –

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

Możesz użyć następujących czynności, aby osiągnąć to, czego potrzebujesz:

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

Tak więc, jeśli jest więcej niż hrabia zera oznacza, że ​​niektórzy klienci, którzy mają drugie imię.

Albo dla lepszej wydajności można powiedzieć:

bool customerWithMiddleName; 

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

To nie jest dobry pomysł, ponieważ wykonuje całą kwerendę, tylko aby wiedzieć, czy istnieje jeden pasujący element. Weź pod uwagę, że klienci zawierają 1000000 klientów, a pierwszy ma średniego poziomu. 'Any (cust => cust.HasMiddleName)' zwróci 'true' natychmiast, podczas gdy twoje podejście sprawdzi każdy element przed jego zwróceniem. –

+2

To wymaga kodu, aby policzyć liczbę poprawnych pozycji, zamiast zwarcia przy pierwszym znalezieniu dopasowania. To może być niepotrzebnie drogie. Lepiej używać. Any(). – StriplingWarrior