Список <A>, содержащий Список <B>, содержащий Список <C> - PullRequest
1 голос
/ 03 ноября 2011

У меня есть структура, похожая на следующую.

class A    
{    
    string title;    
    List<B> bItem;    
}

class B    
{    
    int price;    
    List<C> cItem;    
}

class C    
{    
    int quantity;    
}

List<A> содержит около 200 000 экземпляров «A»;

Теперь объект «A» таков, что содержит список«B» и объект «B» содержат список «C»;У меня также есть несколько экземпляров List<A>.Теперь я хочу найти все «А» в списке, имеющие такие «В», и все «В», имеющие такие «С», содержащие quantity > 500;

Проблема, с которой я сталкиваюсь, заключается в определениицель для LINQ.

Если я использую listA[0].listB[6].listC, тогда мой поиск ограничивается только упомянутой целью, но я хочу найти весь объект "listA".


Спасибо за ответ,Поскольку я использую иерархический объект, я не могу получить прямой доступ к данным, указав a.bitem или c.quality.поэтому, чтобы приблизиться к c.quality, я должен сделать aList [index] .bList [index] .cList [index] .quantity.и, насколько мне известно, я не могу указать напрямую a.bList или c.quantity или a.bItem.

, как в запросе LINQ, мы предоставляем целевое тело или базовый контейнер данных для запроса, задавая цель как "aList [index] .bList [index] .cList [index] .quantity "ограничивает мой поисковый контейнер.

Я хочу найти все экземпляры количества во всем моем объекте aList.

ifиспользуя LINQ to DataSet, мы получаем полный объект «C» в одной таблице, поэтому мы можем запросить все c.quantity независимо от их родителя.Как можно сделать симлер в LINQ для объекта.

Спасибо,

Мухаммед

Ответы [ 3 ]

4 голосов
/ 03 ноября 2011

Как уже упоминалось, ваш вопрос неясен, но возможно , что вы ищете:

var query = listA.Where(a => a.bItem
                              .All(b => b.cItem.All(c => c.quantity > 500)));

Другими словами, для каждого A проверьте, что все B соответствуют(все C в пределах B имеют количество больше 500).

1 голос
/ 03 ноября 2011

Я думаю это то, что вы хотите:

 var result = aCol.where(a => a.bItem.Any(b => b.cItem.Any(c => c.quantity > 500)));
1 голос
/ 03 ноября 2011
IEnumerable<A> list = new List<A>(...); // assuming

var a500 = from a in list
           from b in a.bItem
           from c in b.cItem
           where c.quantity > 500
           select a;
...