2011-10-25 25 views
5

Với Danh sách chung, cách nhanh nhất để kiểm tra xem một mặt hàng có tồn tại một điều kiện nhất định hay không, và nếu nó tồn tại, hãy chọn nó mà không cần tìm kiếm hai lần trong danh sách:Kiểm tra mục trong Danh sách chung trước khi sử dụng nó

Ví dụ:

if (list.Exists(item => item == ...)) 
{ 
    item = list.Find(item => item == ...) 
    .... 
} 
+0

Chỉ cần tìm. – dlev

+1

và nếu mục! = Null bạn là vàng –

Trả lời

5

Hoặc sử dụng Find một lần và so sánh kết quả với default(T), hoặc nếu default(T) có thể là mục riêng của mình, sử dụng FindIndex và kiểm tra xem index là -1:

int index = list.FindIndex(x => x...); 
if (index != -1) 
{ 
    var item = list[index]; 
    // ... 
} 

Nếu bạn đang sử dụng .NET 3.5 hoặc cao hơn, đó là thành ngữ hơn để sử dụng LINQ - một lần nữa, nếu default(T) không phải là một vấn đề, bạn có thể sử dụng một cái gì đó như:

var item = list.FirstOrDefault(x => x....); 
if (item != null) 
{ 
    ... 
} 

Sử dụng LINQ sẽ cho phép bạn thay đổi từ List<T> thành các bộ sưu tập khác về sau mà không thay đổi mã của bạn.

3

bạn có thể làm điều đó chỉ đơn giản với LINQ, chỉ cần thêm bằng System.Linq ở trên cùng của không gian tên của bạn;

Đầu tiên nếu bạn muốn để có được tất cả các kết quả:

var items = list.Where(item=>item.Id == giveID).ToList(); 

Hoặc nếu bạn chỉ muốn kết quả đầu tiên;

var result = list.FirstOrDefault(item=>item.ID == givenID); 

thay vì item.Id == givenID bạn có thể đặt tiêu chí của riêng mình. ví dụ nếu mục là chuỗi bạn có thể làm item == "Test" hoặc nếu là int làm item == 5 ...

+0

Tôi sẽ không làm '.ToList()' theo mặc định. Điều này sẽ giúp bạn có cơ hội thực hiện lợi nhuận. '.ToList()' cung cấp cho bạn một danh sách các mục tìm thấy, trong khi không có điều đó bạn sẽ nhận được một IEnumerator để lặp qua các mục. – Fischermaen

+0

@ Fischermaen Tôi sẽ không làm điều đó, nhưng bởi vì tôi thấy OP không quen thuộc với linq và thực hiện deffered gây ra sự mơ hồ tôi đề nghị này, Cuối cùng bạn nên thực hiện chuẩn bị biểu hiện cây, Vì vậy mà không cần viết vào danh sách, Nó chỉ làm cho truy vấn và không nhận được bạn bất kỳ IEnumerable (không làm cho những sai lầm của những gì bạn nhìn thấy trong thời gian biên dịch). Bạn có thể thực hiện nó mọi lúc bạn muốn, nhưng nên làm điều đó nếu bạn muốn. nó có thể được thực hiện bởi vòng lặp foreach hoặc mọi thứ khác –

5
item = list.Find(item => item == ...); 
if(null != item) 
{ 
    //do whatever you want 
} 
+1

Lưu ý rằng điều này không hoạt động nếu 'null' là một giá trị hợp lệ mà bạn có thể đang tìm kiếm. Nó cũng không làm việc cho 'List ' vv Cũng lưu ý rằng không cần sử dụng cách tiếp cận "liên tục đầu tiên" trong điều kiện trong C#, ngoại trừ các tình huống mà bạn kiểm tra một cách rõ ràng sự bình đẳng với các giá trị 'bool'. –

+0

Có & cảm ơn, bạn đã đúng. Nhưng tôi không hiểu điểm thứ hai của bạn những gì khác biệt null = item và item! = Null làm cho? –

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