Có các lớp sau (cao đơn giản):LINQ: Làm cách nào để lấy các mục từ danh sách bên trong vào một danh sách?
public class Child
{
public string Label;
public int CategoryNumber;
public int StorageId;
}
public class Parent
{
public string Label;
public List<Child> Children = new List<Child>();
}
Và có các dữ liệu sau:
var parents = new List<Parent>();
var parent = new Parent() {Label="P1"};
parent.Children.Add(new Child() {Label="C1", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C2", CategoryNumber=2, StorageId=20});
parents.Add(parent);
parent = new Parent() {Label="P2"};
parent.Children.Add(new Child() {Label="C3", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C4", CategoryNumber=2, StorageId=30});
parents.Add(parent);
parent = new Parent() {Label="P3"};
parent.Children.Add(new Child() {Label="C5", CategoryNumber=3, StorageId=10});
parent.Children.Add(new Child() {Label="C6", CategoryNumber=2, StorageId=40});
parents.Add(parent);
Bây giờ, làm thế nào tôi sẽ nhận được một danh sách các trẻ em (với CategoryNumber = 2) từ danh sách của cha mẹ có chứa ít nhất một đứa trẻ với CategoryNumber = 1?
tôi có thể làm như sau nhưng nó không xuất hiện để được tối ưu:
var validParents = from p in parents
where p.Children.Any (c => c.CategoryNumber==1)
select p;
var selectedChildren = validParents.Select(p => from c in p.Children
where c.CategoryNumber == 2
select c);
Đây là những gì tôi nhận được cho selectedChildren:
IEnumerable<IEnumerable<Child>>
IEnumerable<Child>
- C2 2 20
IEnumerable<Child>
- C4 2 30
Có thể chỉ có một danh sách phẳng chứa các yếu tố hai đứa con thay vì hai tiểu danh sách? Làm thế nào nó sẽ dịch trong LINQ?
@Eric: Vâng, cú pháp truy vấn LINQ cho điều này là khá tốt đẹp (và có lẽ tốt hơn một chút để sử dụng như trái ngược với cú pháp truy vấn trộn và phương pháp mở rộng). Bất cứ khi nào tôi gặp chủ đề này, tôi cảm thấy LINQ thiếu một toán tử nối (tương tự như Seq.concat trong F #), có thể được sử dụng như một giải pháp thay thế cho SelectMany, và thực sự rất tiện dụng trong các trường hợp khác. Một quá tải đơn giản của phương thức Enumerable.Concat có tham số IEnumerable> sẽ thực hiện công việc khá tốt. Bất kỳ suy nghĩ (hoặc thậm chí tốt hơn, kế hoạch) liên quan đến điều này? –
Noldorin
Ah, có vẻ như MoreLINQ định nghĩa toán tử này: http://code.google.com/p/morelinq/wiki/OperatorsOverview. Nó sẽ là khá tốt đẹp để có trong BCL mặc dù (cùng với một vài người khác như Zip). – Noldorin
cảm ơn ... bạn đã cứu ngày của tôi – thiagolsilva