2014-01-30 2 views
0

У меня есть List из «виджета» (которые имеют идентификатор int) и List выбранных идентификаторов. Моя конечная цель - иметь список гидратированных виджетов, которые согласуются с списком идентификаторов внутри моего «набора».Удалите элементы из списка, используя их идентификаторы и linq

public List<Widget> widgets { get; set; } 

public List<int> widgetIds 
{ 
    get 
    { 
     return widgets.Select(x => x.widgetId).ToList(); 
    } 
    set 
    { 
     foreach (int addId in value.Except(widgets.Select(x => x.widgetId))) 
     { 
      widgets.Add(_dbWidgetHelper.getWidget(addId)); 
     } 

     //I need to invert the add somehow 
    } 
} 

Я пытался все, что я могу думать, используя RemoveAll и Except, но я не могу обернуть мою голову вокруг решения еще. Я знаю, что это можно сделать в одной строке, но ближайший у меня есть:

var removeIds = widgets.Select(x => x.widgetId).Except(value); 

//this is me trying anything I can think of... obviously a syntax error. 
widgets.RemoveAll(x=>x.widgetId in removeIds); 

ответ

2

Попробуйте следующее. Обратите внимание, что я изменил removeIds быть HashSet<int>, чтобы предотвратить запрос от повторного оценивали каждый раз и сделать выглядеть быстрее

var removeIds = new HashSet<int>(widgets.Select(x => x.widgetId).Except(value)); 

widgets.RemoveAll(x => removeIds.Contains(x.widgetID)); 
+0

это может быть объединены в 1-лайнер? стоит ли производительность/удобочитаемость? – pennstatephil

+0

ОК, я посмотрел на 'widgets.RemoveAll (x => widgets.Select (y => y.widgetId) .Except (value) .Contains (x.widgetId)); и он мгновенно дал мне головную боль, поэтому я Я скажу, что он не прошел проверку на читаемость. – pennstatephil

Смежные вопросы