2012-07-19 27 views
6

Tôi muốn chuyển đổi mã này thành giải pháp LINQ. Nó trông như thế nào trong bộ sưu tập của khách hàng và xem liệu ít nhất một trong số đó có tên đệm. Mã này hoạt động tốt, tôi chỉ cố gắng tìm hiểu LINQ, vì vậy tìm kiếm một giải pháp thay thế .:Trận đấu đầu tiên trong bộ sưu tập

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

Tôi cố gắng để viết một cái gì đó như: (Customers.Foreach(x=>x.HasMiddleName==true)... nhưng trông dòng nó không phải là phương pháp tôi đang tìm kiếm .

+0

FYI - phương pháp ForEach vào Danh sách chỉ thực hiện chức năng nhất định trên mỗi thành viên trong danh sách – cordialgerm

Trả lời

18

Nếu bạn chỉ muốn biết nếu theres ít nhất một, bạn có thể sử dụng Enumerable.Any:

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

Nếu bạn muốn biết cus phù hợp đầu tiên Tomer, bạn có thể sử dụng Enumerable.First hoặc Enumerable.FirstOrDefault để tìm ra khách hàng đầu tiên với MiddleName==true:

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

First ném một InvalidOperationException nếu chuỗi nguồn là trống rỗng, trong khi lợi nhuận FirstOrDefaultnull nếu không có trận đấu.

+0

Bất kỳ cách nào trả về true hoặc false từ truy vấn? – user194076

+0

@ user194076: Bạn có thể sử dụng 'Bất kỳ' nếu bạn muốn kiểm tra xem có ở một khách hàng phù hợp không. Đã chỉnh sửa câu trả lời của tôi. –

1

Dựa trên điều này:

Những gì nó có vẻ thành một bộ sưu tập của khách hàng và xem nếu ít nhất một trong những có tên đệm.

Hãy thử

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

trở Truy vấn này true nếu ít nhất một custmer có tính chất HasMiddleName = true

+1

Nice - Bất kỳ là những gì tôi đang tìm kiếm. Cảm ơn! – user194076

+6

'Bất kỳ' có một vị từ, vì vậy bạn có thể rút ngắn điều này để' trả lại Customer.Any (x => x.HasMiddleName); ' –

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

Bạn có thể sử dụng sau đây để đạt được những gì bạn cần:

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

Vì vậy, nếu Count là nhiều hơn không có nghĩa là bạn có một số khách hàng có tên Trung.

Hoặc cho hiệu suất tốt hơn bạn có thể nói:

bool customerWithMiddleName; 

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

Đó không phải là một ý tưởng hay vì nó thực thi toàn bộ truy vấn, chỉ để biết nếu có một phần tử phù hợp. Hãy xem xét rằng khách hàng có 1000000 khách hàng và người đầu tiên có một middlename. 'Any (cust => cust.HasMiddleName)' sẽ trả về 'true' ngay lập tức trong khi cách tiếp cận của bạn sẽ kiểm tra từng phần tử trước khi nó trả về. –

+2

Điều này yêu cầu mã phải đếm số lượng mục chính xác, thay vì đoản mạch trong lần đầu tiên tìm thấy kết quả phù hợp. Nó có thể tốn kém không cần thiết. Tốt hơn để sử dụng .Any(). – StriplingWarrior

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