2015-11-18 15 views
5

Tôi có một cấu trúc như thế này:mệnh đề WHERE trong LINQ trong Danh sách C#

struct Test 
{ 
    string name; 
    string family; 
    public Test... 
} 

trong mã của tôi, tôi có một danh sách các struct này:

List<Test> testList=new List<Test>(); 

Tôi có một biểu LINQ như thế này:

var list =testList.Select(n=>n.Name); 

nhưng làm cách nào để lọc lựa chọn này theo họ của danh sách kiểm tra? một cái gì đó như thế này:

var list=testList.Select(n=>n.Name).Where(f=>f.Family==""); 

này đâu khoản chỉ áp dụng trên tên được lựa chọn đó là một danh sách các chuỗi

Bất kỳ ý tưởng làm thế nào để làm điều đó?

+0

Xóa 'Chọn'. –

+1

Hoặc di chuyển nó đến sau 'Where'. –

Trả lời

9

Chỉ cần đặt Where trước Select:

var list=testList.Where(f=>f.Family=="").Select(n=>n.Name); 

Trong LINQ bạn cần phải áp dụng các bộ lọc trước chiếu (trừ trường hợp bộ lọc áp dụng các kết quả của dự báo chứ không phải là bộ sưu tập bản gốc).

4

Bộ lọc sử dụng Where trước khi bạn chỉ chọn một thuộc tính sử dụng Select. Bằng cách đó, bạn vẫn nhận được đầy đủ các đối tượng:

testList.Where(t => t.Family == "").Select(t => t.Name) 

Sau khi tất cả, Select sẽ mất các đối tượng và sau đó chỉ truyền lại bất cứ điều gì bạn quay lại trong lambda. Trong trường hợp này, bạn chỉ trả lại một chuỗi, vì vậy bạn hãy ném tất cả thông tin khác từ đối tượng Test. Và như vậy, thông tin bạn muốn lọc không còn khả dụng nữa.

Nếu bạn chuyển đổi xung quanh, bạn có thể lọc trên đối tượng thử nghiệm và sau đó chỉ trả lại một chuỗi đó.

1

Thông thường khi tôi kiểm tra giá trị trống như vậy, tôi sẽ sử dụng string.IsNullOrEmpty(), chỉ trong trường hợp.

testList.Where(f=> string.IsNullOrEmpty(f.Family)).Select(n=>n.Name); 
Các vấn đề liên quan