2009-07-01 29 views

Trả lời

327

LINQ định nghĩa một phương pháp mở rộng đó là hoàn hảo để giải quyết vấn đề này chính xác:

using System.Linq; 
... 
    bool has = list.Any(cus => cus.FirstName == "John"); 

chắc chắn rằng bạn tham khảo System.Core.dll, đó là nơi LINQ sống.

+13

Mọi thứ đều tốt, tôi tự hỏi có bao nhiêu nhà phát triển sử dụng Bá tước khi họ nên sử dụng Bất kỳ? – RichardOD

+11

Bạn cũng có thể thực hiện tìm kiếm không phân biệt chữ hoa chữ thường: cus => cus.FirstName.Equals ("John", StringComparison.CurrentCultureIgnoreCase) – jmservera

+1

Tôi biết đây là câu hỏi cũ nhưng tại sao chúng ta không sử dụng phương pháp Exists? Thấy như nó được thực hiện để xem nếu mọi thứ tồn tại. – Blackunknown

1
customerList.Any(x=>x.Firstname == "John") 
+0

Điều này không trả lời câu hỏi "nếu" mục nhập đó tồn tại; nó chỉ liệt kê các giá trị nếu chúng tồn tại. Một bước bổ sung là cần thiết để xác định nếu điều tra này là nonempty. – jason

+0

LINQ của bạn không chính xác, phải là: từ x trong customerList ... – jmservera

+0

Sau đó thay đổi Vị trí thành Bất kỳ. Có lẽ triết học hơn đối với tôi. Tôi hiếm khi cần phải biết nếu không quan tâm đó là những gì họ đang có. @jmservera: bạn đã đúng. Tôi đã từ bỏ LINQ một thời gian và bây giờ sử dụng Lambda độc quyền. –

2
List<Customer> list = ...; 
Customer john = list.SingleOrDefault(customer => customer.Firstname == "John"); 

john sẽ được null nếu không có khách hàng tồn tại với một tên đầu tiên của "John".

+1

Điều đó sẽ ném một ngoại lệ nếu * nhiều hơn một * khách hàng được gọi là John. –

+1

Cảm ơn nhận xét. Tôi sẽ để lại câu trả lời như một ví dụ chính xác một phần. – M4N

+0

Nó vẫn còn hợp lệ trong một kịch bản khi bạn chắc chắn có 1 và bạn muốn có một ngoại lệ được nêu ra nếu nhiều hơn một, vì vậy tôi nghĩ rằng nó là tốt mà bạn đã không xóa nó. – RichardOD

75

Câu trả lời của zvolkov là câu trả lời hoàn hảo nhất để tìm ra nếu có một khách hàng như vậy. Nếu bạn cần phải sử dụng sau đó các khách hàng, bạn có thể làm:

Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John"); 
if (customer != null) 
{ 
    // Use customer 
} 

Tôi biết đây không phải là những gì bạn đã hỏi, nhưng tôi nghĩ rằng tôi muốn trước empt một câu hỏi tiếp theo về :) (Tất nhiên, điều này chỉ tìm thấy đầu tiên khách hàng như vậy ... để tìm tất cả trong số họ, chỉ cần sử dụng một where khoản bình thường.)

+7

Tôi muốn chỉ ra rằng bạn có thể đánh giá cao việc thực hiện điều này sau này khi nói đến gỡ lỗi, nếu bạn thấy mình đột nhiên tò mò mà khách hàng đó là phù hợp với tiêu chí. – mquander

+1

Chỉ cần nhấn câu trả lời này lên một cos Tôi thích cách cộng đồng SO đi thêm bước để thêm nhiều hơn cho câu hỏi/câu trả lời. – barneymc

+1

cảm ơn nó đã giúp tôi, nhưng đôi khi tôi chỉ muốn có được kết quả 'bool', vì vậy trong trường hợp đó' .Any' hoặc '.FindIndex' được sử dụng [ở đây] (http://stackoverflow.com/a/4937099/2218697) ** nhanh **? – stom

0

một khả năng

if (list.Count(customer => customer.Firstname == "John") > 0) { 
//bla 
} 
+2

'Thích hợp hơn để sử dụng Bất kỳ trong trường hợp này. – RichardOD

+0

Vâng, tôi không biết, rằng Bất kỳ() chấm dứt nếu các yếu tố được tìm thấy ... – Krassi

9

sử dụng LINQ bạn có nhiều possibiliti es, ở đây một mà không sử dụng lambdas:

//assuming list is a List<Customer> or something queryable... 
var hasJohn = (from customer in list 
     where customer.FirstName == "John" 
     select customer).Any(); 
19

Một lựa chọn cho theo về câu hỏi (làm thế nào để tìm khách hàng có thể có bất kỳ số lượng tên đầu tiên):

List<string> names = new List<string>{ "John", "Max", "Pete" }; 
bool has = customers.Any(cus => names.Contains(cus.FirstName)); 

hoặc để lấy khách hàng từ csv danh sách tương tự

string input = "John,Max,Pete"; 
List<string> names = input.Split(',').ToList(); 
customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName)); 
3

kỹ thuật tôi sử dụng trước khi khám phá .Any():

var hasJohn = (from customer in list 
     where customer.FirstName == "John" 
     select customer).FirstOrDefault() != null; 
2

Hãy thử điều này, tôi hy vọng nó sẽ giúp bạn.

if (lstCustumers.Any(cus => cus.Firstname == "John")) 
{ 
    //TODO CODE 
} 
+2

Đó là giống như câu trả lời được chấp nhận từ hơn 8 năm trước đây. Hãy đảm bảo câu trả lời của bạn là duy nhất trong số tất cả các câu trả lời. –

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