Подтвердить что ты не робот

LINQ: выберите, где объект не содержит элементов из списка

Я борюсь с синтаксисом LINQ здесь... думал, что я брошу его здесь. Я не могу найти то, что я ищу где-то еще.

ОК, скажем, у меня есть это:

public class Bar
{
   public int BarId { get; set; }
}

public class Foo
{
   public List<Bar> BarList { get; set; }
}

List<Foo> fooBunch = GetABunchOfFoos(); //let just assume I'm getting more than one
List<Foo> fooSelect = new List<Foo>;
List<Bar> filterBars = GetAFewBars(); //assume I'm getting like 2 or 3

fooSelect = (from f in fooBunch
             where !(from b in f.BarList select b.BarId).Contains(ITEM FROM filterBars.BarId)
             select f).ToList();

Итак, длинный рассказ, я хочу использовать LINQ для фильтрации моего списка объектов на основе объектов из другого списка. Я надеюсь в этом есть смысл. Я думаю, что я просто потерял часть Содержит... Я не знаю, как это написать.

4b9b3361

Ответ 1

В общем, вы ищете расширение "Исключить".

var rejectStatus = GenerateRejectStatuses();
var fullList = GenerateFullList();
var rejectList = fullList.Where(i => rejectStatus.Contains(i.Status));
var filteredList = fullList.Except(rejectList);

В этом примере GenerateRegectStatuses() должен быть списком статусов, которые вы хотите отклонить (или более конкретно на основе вашего примера, List<int> идентификаторов)

Ответ 2

запишите это в более конкретную коллекцию только идентификаторов, которые вы не хотите

var notTheseBarIds = filterBars.Select(fb => fb.BarId);

попробуйте следующее:

fooSelect = (from f in fooBunch
             where !notTheseBarIds.Contains(f.BarId)
             select f).ToList();

или это:

fooSelect = fooBunch.Where(f => !notTheseBarIds.Contains(f.BarId)).ToList();

Ответ 3

Я не пробовал это, поэтому я не гарантирую ничего, однако

foreach Bar f in filterBars
{
     search(f)
}
Foo search(Bar b)
{
    fooSelect = (from f in fooBunch
                 where !(from b in f.BarList select b.BarId).Contains(b.ID)
                 select f).ToList();

    return fooSelect;
}